【问题标题】:Ambiguous symbol模棱两可的符号
【发布时间】:2012-08-27 10:56:36
【问题描述】:

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

编译。

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

【问题讨论】:

  • “整数”不是保留字吗??
  • 某处可能有using boost::Integer
  • 尝试在SomeClass x(Integer(4)); 中指定MyNameSpace::Integer,以便告诉编译器这是您想要的整数。
  • Nitpick:“命名空间”是一个单词,所以不要将“s”大写。 ;) 问题:您实际上是用文字4 或其他东西初始化Integer 类吗? ADL 可以在这里欺骗你。虽然,如果你用一个变量来初始化它,那应该会触发最令人头疼的解析而不是“歧义符号”错误......嗯......
  • "This is supported by the test that" -- 你能用Integer 进行测试,而不用using namespace MyNameSpace; 吗?它应该给出一个未声明的标识符错误,但如果它仍然选择boost::Integer,那么你必须在某个地方成为using

标签: c++ visual-studio-2008


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    内部
    namespace MyNameSpace
    {
       Integer::someMethod(
    }
    

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

    祝你好运!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-17
      • 1970-01-01
      • 1970-01-01
      • 2016-06-05
      • 1970-01-01
      • 2013-08-10
      相关资源
      最近更新 更多