3

我在自定义命名空间中声明了一个 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'

我已经通过全文搜索在我的代码库中搜索了“命名空间提升”和“使用提升”,但没有找到像“使用命名空间提升;”这样的行。这得到了测试的支持

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));
}

编译。

是否有任何其他原因导致“歧义符号”错误发生?

4

2 回答 2

0

编译器只是阻止你混合这些类。即使您不使用命名空间“boost”。

于 2012-08-27T11:45:10.317 回答
0

命名空间本质上是其中内容的“姓氏”或“姓氏”。在您的情况下,Integer() 的全名是 MyNameSpace::Integer()。您的具体错误是使用命名空间的第一条规则的一个极好的例子。不要使用“使用”语句!如果你完全忽略它们,是的,你必须输入一些额外的东西来安抚编译器。但是您永远不会发生碰撞或询问“boost 在某处是否有整数”之类的问题。

其次, someMethod() 在任何类和任何命名空间之外。它真的应该看起来更像MyNameSpace::Integer::someMethod( ) 或更合理地位于

namespace MyNameSpace
{
   Integer::someMethod(
}

一旦你这样做了,编译器将帮助你找到东西在哪里或不在哪里。

祝你好运!

于 2012-08-27T17:59:18.780 回答