次のC++テストコードはリンクしていません(gcc 4.9.2、binutils 2.25)。エラーはIn function 'main': undefined reference to 'X::test'
です。そのため09行の「名前空間を使用する」とは何を正確にしますか?
01: #include <string>
02: #include <iostream>
03:
04: namespace X
05: {
06: extern std::string test;
07: };
08:
09: using namespace X;
10: std::string test = "Test";
11:
12: int main()
13: {
14: std::cout << X::test << std::endl;
15: }
、私が代わりに無関係なtest
変数がグローバル名前空間で宣言され、定義されていることを信じているライン06で宣言X::test
変数、したがって、リンクエラーを定義するためにライン10を期待していました。
質問:私の期待が間違っていた理由と正確に何が起こっているのか説明してください。
ない答え:
- 私はそれが
std::string X::test = "Test";
にライン10をリンク変更することができます。 - まず、 "using namespace"を使用しないでください。
「extern」という名前空間の中で、名前空間を見つけることができます。名前空間の中で定義されることはなく、コンパイラはそれを見つけることができません。 'Undefined reference'。あなたに質問する:なぜそれは外出する必要があるのですか? – wouter140
@wouter140: 'extern'は「名前空間外のものを探しています」とは関係ありません。単に「これは他の場所(extern)alに定義されています」という意味です。 – DevSolar
@curiousguy言い換えれば、 "どこかの他の場所"、または実際はどこにいても。単に「これは単なる宣言であり、定義ではない」という意味です。 – Angew