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'

全文検索で「namespace boost」と「using boost」のコード ベースを検索しましたが、「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));
}

コンパイルします。

「あいまいなシンボル」エラーが発生する可能性がある他の理由はありますか??

4

2 に答える 2

0

コンパイラは、このクラスを混同しないようにするだけです。名前空間「ブースト」を使用していない場合でも。

于 2012-08-27T11:45:10.317 に答える
0

名前空間は本質的に、その中のものの「姓」または「姓」です。あなたの場合、Integer() の全体の名前は MyNameSpace::Integer() です。特定のエラーは、名前空間を使用する最初のルールの素晴らしい例です。「USING」ステートメントは使用しないでください。それらを完全に省略した場合、はい、コンパイラをなだめるためにいくつか余分なものを入力する必要があります。しかし、衝突が発生したり、「ブーストには整数がどこかにありますか」などと尋ねたりすることはありません。

第 2 に、someMethod() はどのクラスにも名前空間にもありません。MyNameSpace::Integer::someMethod( )のように見えるか、より合理的に内部にある必要があります

namespace MyNameSpace
{
   Integer::someMethod(
}

これを行うと、コンパイラは、物がどこにあるのか、どこにないのかを見つけるのに役立ちます。

幸運を!

于 2012-08-27T17:59:18.780 に答える