2009-04-29 12 views
5

私はデフォルト/ "ルート"名前空間に2つの名前空間、nsAnsBを定義しました。 nsAには、サブネームスペースnsA :: subAがあります。ネストされたC++ネームスペースをネストされたネームスペースから参照するにはどうすればよいですか?

undefined reference to `nsA::subA::nsB::theFunctionInNsB(...)' 

任意のアイデア:私はNSA ::スバの内部から、NSBに属している関数を参照しようとすると、私はエラーを取得しますか?

答えて

2

は、そのエラーを説明するために、より多くの情報が必要です。次のコードは、罰金です:だから

#include <iostream> 

namespace nsB { 
    void foo() { std::cout << "nsB\n";} 
} 

namespace nsA { 
    void foo() { std::cout << "nsA\n";} 
    namespace subA { 
     void foo() { std::cout << "nsA::subA\n";} 
     void bar() { 
      nsB::foo(); 
     } 
    } 
} 

int main() { 
    nsA::subA::bar(); 
} 

、グローバル名前空間を指定すると、あなたの現在の問題を解決しながら、一般的には、それなしNSB内のシンボルを参照することが可能です。それ以外の場合は、別の名前空間のスコープを使用しているときはいつでも:: std :: cout、:: std :: stringなどを記述する必要があります。そして、あなたはしません。 QED。

グローバル名前空間を指定すると、現在のスコープに別のnsBが表示される場合があります。たとえば、nsA :: subAにはnsBという独自の名前空間またはクラスが含まれていて、nsAではなくnsbB:foo :: subA :: nsB :: foo。たとえば、nsA :: subA :: nsB :: theFunctionInNsB(...)を宣言している(ただし、定義されていない)場合は、あなたが引用したエラーが出ます。おそらく、名前空間subAの内側からnsBのヘッダを#含まれていましたか?

+0

"おそらく#名前空間のサブAからnsBのヘッダーを#含まれましたか?" - 確かに、私は持っていた。偉大なキャッチ、そして良い説明。 – mikeh

7

使用グローバルスコープの解像度:

::nsB::TheFunctionInNsB() 
5
#include <stdio.h> 

namespace nsB { 
    void foo() { 
     printf("nsB::foo()\n"); 
    } 
} 

namespace nsA { 
    void foo() { 
     printf("nsA::foo()\n"); 
    } 

    namespace subA { 
     void foo() { 
      printf("nsA::subA::foo()\n"); 
      printf("calling nsB::foo()\n"); 

      ::nsB::foo();  // <--- calling foo() in namespace 'nsB' 
     } 
    } 
} 

int main() 
{ 
    nsA::subA::foo(); 

    return 0; 
} 
+0

ありがとうマイケル - これらの両方が私の質問に完全に答えると、私は彼に小切手をあげるつもりです。あなたのイラストは、将来のサーファーのためにここにいるのが良いでしょう。 – mikeh

+0

コードサンプルを与える+1。それは答えをより明確にしました –

関連する問題