暧昧的象征

时间:2012-08-27 10:56:37

标签: c++ visual-studio-2008

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

编译。

还有其他原因导致“模糊符号”错误发生吗?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

命名空间本质上是“姓氏”或“姓氏”。在你的情况下,Integer()的全名是MyNameSpace :: Integer()。您的特定错误是使用命名空间的第一条规则的精彩示例。不要使用“使用”声明!如果你把它们彻底抛弃,是的,你必须输入一些额外的东西来安抚编译器。但是你永远不会发生碰撞或者提出任何类似的问题,例如“在某个地方加强整数”。

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

之内
namespace MyNameSpace
{
   Integer::someMethod(
}

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

祝你好运!