【发布时间】: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。