ネストされた名前空間内から外部C ++名前空間を参照するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/803506

  •  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;
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top