我在自定义命名空间中声明了一个类Integer:
namespace MyNameSpace
{
class Integer {};
}
我在这样的方法中使用它:
void someMethod()
{
using namespace MyNameSpace;
SomeClass x(Integer("some text", 4));
}
这给出了
10> error C2872: 'Integer' : ambiguous symbol
10> could be 'g:\lib\boost\boost_1_47_0\boost/concept_check.hpp(66) : boost::Integer'
10> or '[my file] : MyNameSpace::Integer'
我搜索了我的代码库中的“命名空间提升”和“使用提升”与全文搜索,但没有找到像“using namespace boost;”这样的行。
测试支持这一点void someMethod()
{
shared_ptr<int> x;
using namespace MyNameSpace;
//SomeClass x(Integer("some text", 4));
}
给出
error C2065: 'shared_ptr' : undeclared identifier
而
void someMethod()
{
boost::shared_ptr<int> x;
using namespace MyNameSpace;
//SomeClass x(Integer("some text", 4));
}
编译。
还有其他原因导致“模糊符号”错误发生吗?
答案 0 :(得分:0)
编译器只是阻止你混合这些类。即使您没有使用命名空间“boost”。
答案 1 :(得分:0)
命名空间本质上是“姓氏”或“姓氏”。在你的情况下,Integer()的全名是MyNameSpace :: Integer()。您的特定错误是使用命名空间的第一条规则的精彩示例。不要使用“使用”声明!如果你把它们彻底抛弃,是的,你必须输入一些额外的东西来安抚编译器。但是你永远不会发生碰撞或者提出任何类似的问题,例如“在某个地方加强整数”。
其次,someMethod()在任何类之外且在任何名称空间之外。它应该看起来更像是 MyNameSpace :: Integer :: someMethod()或者更合理地位于
之内namespace MyNameSpace
{
Integer::someMethod(
}
一旦你这样做,编译器将帮助你找到什么东西在哪里。
祝你好运!