编译错误:C2872 不明确的符号....using namespace std;

编译器错误 C2872

Visual Studio 2005
错误消息
“symbol”: 不明确的符号

编译器无法确定要引用哪个符号。

如果头文件包含 using Directive (C++),并且后续的头文件已使用 #include 并包含一个也位于 using 指令中指定的命名空间中的类型,则会出现 C2872 错误。仅在使用 #include 指定所有头文件后,才能指定 using 指令。

有关 C2872 的更多信息,请参见 http://support.microsoft.com/default.aspx?scid=kb;en-us;316317

下面的示例生成 C2872:

// C2872.cpp
namespace A {
   int i;
}

using namespace A;
int i;
int main() {
   ::i++;   // ok
   A::i++;   // ok
   i++;   // C2872 ::i or A::i?
}

转载于:https://www.cnblogs.com/mysunnyday/archive/2011/05/09/2040840.html

在 C++ 编程中,`std::` 和 `using namespace std;` 是与命名空间相关的两种同机制,它们的目的都是为了访问标准库中的标识符(如 `cout`、`cin`、`string` 等),但其作用方式和使用场景存在差异。 当代码中同时使用了 `std::` 显式限定标准库名称,并引入了整个 `std` 命名空间(通过 `using namespace std;`),这种做法从技术上讲是合法的,会导致编译错误。然而,这种组合使用在实际开发中是否属于重复行为,需要结合上下文来判断。 ### `using namespace std;` 的作用 该语句的作用是将 `std` 命名空间中的所有名称引入当前作用域,使得可以直接使用这些名称而无需加上 `std::` 前缀。例如,在包含该语句后,可以直接写 `cout << "Hello";` 而必写成 `std::cout << "Hello";` [^2]。 ### `std::` 的作用 即使已经使用了 `using namespace std;`,仍然可以显式地使用 `std::` 来限定某个标准库标识符。这种做法并会造成语法错误,反而有时是为了增强代码的可读性和避免潜在的命名冲突。例如: ```cpp #include <iostream> using namespace std; int main() { std::cout << "Hello, World!" << std::endl; return 0; } ``` 上述代码虽然引入了整个 `std` 命名空间,但依然使用了 `std::cout` 和 `std::endl`。这种写法可以明确指出所使用的对象来自标准库,尤其在大型项目或头文件中,这种方式有助于减少命名冲突的风险 [^1]。 ### 是否重复? 因此,从功能上看,如果已经使用了 `using namespace std;`,再在标识符前加上 `std::` 并是必要的,但从编码风格和清晰度的角度来看,它并构成“重复”意义上的冗余。相反,它可能是一种良好的实践,特别是在多人协作或复杂项目中 [^4]。 ### 小结 - 同时使用 `std::` 和 `using namespace std;` 是允许的。 - 这种做法并非真正的“重复”,而是对命名空间机制的同层面的应用。 - 在某些情况下,显式使用 `std::` 可以提高代码的可读性并避免潜在的名称冲突。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值