Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 歧义符号_C++_Visual Studio 2008 - Fatal编程技术网

C++ 歧义符号

C++ 歧义符号,c++,visual-studio-2008,C++,Visual Studio 2008,我已在自定义命名空间中声明了一个类整数: 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:\

我已在自定义命名空间中声明了一个类整数:

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'

我已经通过全文搜索搜索了我的代码库中的“名称空间boost”和“usingboost”,但没有找到像“usingnamespace boost;”这样的行。这得到了以下测试的支持:

void someMethod()
{
  shared_ptr<int> x;
  using namespace MyNameSpace;
  //SomeClass x(Integer("some text", 4));
}
鉴于

void someMethod()
{
  boost::shared_ptr<int> x;
  using namespace MyNameSpace;
  //SomeClass x(Integer("some text", 4));
}
void someMethod()
{
boost::共享_ptr x;
使用名称空间MyNameSpace;
//SomeClass x(整数(“某些文本”,4));
}
编译


出现“不明确符号”错误还有其他原因吗?

编译器只是防止您混淆这些类。即使您没有使用名称空间“boost”。

名称空间本质上是其中内容的“姓氏”或“姓氏”。在您的例子中,Integer()的全名是MyNameSpace::Integer()。特定的错误是使用名称空间的第一条规则的极好例子。不要使用“使用”语句!如果你完全忽略了它们,是的,你必须输入一些额外的东西来安抚编译器。但你们从来并没有遇到过碰撞,也并没有问过类似于“boost在某处有整数吗?”

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

namespace MyNameSpace
{
   Integer::someMethod(
}
一旦您这样做,编译器将帮助您找到东西在哪里或不在哪里


祝你好运

“整数”不是一个保留字吗?可能有一个
使用boost::Integer
的地方。尝试在
SomeClass x(Integer(4))中指定
MyNameSpace::Integer
告诉编译器这是您想要的整数。吹毛求疵:“名称空间”是一个单词,所以不要大写“s”。)问题:您实际上是在用文本
4
或其他东西初始化
Integer
类吗?ADL可以在这里欺骗你。尽管如此,如果您使用变量初始化它,应该会触发最麻烦的解析,而不是“不明确的符号”错误。。嗯…“这得到了测试的支持”--你能不能用
整数
进行测试,而不用
使用名称空间MyNameSpace?它应该给出一个未声明的标识符错误,但是如果它仍然拾取
boost::Integer
,那么您必须在某个地方使用它。
namespace MyNameSpace
{
   Integer::someMethod(
}