ネストされた名前空間内から外部C ++名前空間を参照するにはどうすればよいですか?
-
03-07-2019 - |
質問
default /" root"に2つの名前空間が定義されています名前空間、 nsA および nsB 。 nsA にはサブ名前空間 nsA :: subA があります。 nsA :: subA の内部から nsB に属する関数を参照しようとすると、エラーが発生します:
undefined reference to `nsA::subA::nsB::theFunctionInNsB(...)'
アイデアはありますか
解決
そのエラーを説明するために、さらに情報が必要です。次のコードで問題ありません:
#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のヘッダーを#includeしましたか?
他のヒント
グローバルスコープ解決を使用:
::nsB::TheFunctionInNsB()
#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;
}
所属していません StackOverflow