2

名前空間を理解できません。A.cpp:

#include <iostream>
namespace A { int pause = 8; }
int main() {
    std::cout << A::pause << std::endl;
    return 0;
}

そしてそれは印刷し8ます。ただし、今は追加using namespace Aして変更A::pauseするだけpauseです。A.cpp:

#include <iostream>
namespace A { int pause = 8; }
using namespace A;
int main() {
    std::cout << pause << std::endl;
    return 0;
}

ここで、コンパイル エラーが発生します。

A.cpp: In function ‘int main()’:
A.cpp:5: error: reference to ‘pause’ is ambiguous
/usr/include/unistd.h:507: error: candidates are: int pause()
A.cpp:2: error:                 int A::pause
A.cpp:5: error: reference to ‘pause’ is ambiguous
/usr/include/unistd.h:507: error: candidates are: int pause()
A.cpp:2: error:                 int A::pause

誰かが何がうまくいかなかったのか説明できますか? を省略できるようにする方法と同様に、using namespace Aを省略できると思いました。行を移動しようとしましたが、同じエラー メッセージが表示されます。で宣言されていると明らかに競合するため、意図的に変数名を選択したことに注意してください。フィードバックをお待ちしております。ありがとう!A::using namespace stdstd::main()pausepause()iostream

4

4 に答える 4

7

コンパイラは、何が問題なのかを教えてくれます。解決できるルートは 2つpauseありA::pauseます。コンパイラはどちらを使用するかを決定できないため、それを支援する必要があります。pause()<unistd.h>

名前空間内の変数にあまり一般的でない名前を選択した場合A、たとえばpause_val、名前空間のスコープなしで出力できます

#include <iostream>
namespace A { int pause_val = 8; }
using namespace A;
int main() {
    std::cout << pause_val << std::endl;
    return 0;
}
于 2013-02-07T13:56:36.050 に答える
4

という名前のシステム関数があるためpauseです。エラー メッセージを詳しく確認すると、システム ヘッダーでも定義されていることがわかります<unistd.h>

システムpause関数はグローバル名前空間にあり、その場合using namespace A、シンボルをA名前空間からグローバル名前空間にも取り込みます。これpauseで、グローバル名前空間で名前が付けられた 2 つのシンボルができました。これは、コンパイラが不平を言っていることです。

関数のみを呼び出すことができ、整数変数を呼び出すことができないため、 function を呼び出した場合は機能した可能性があります。pauseただし、関数を変数として (関数ポインターとして) 使用することもできるため、この競合が発生します。

于 2013-02-07T13:56:56.133 に答える
3

誰かが何が悪かったのか説明できますか?名前空間Aを使用すると、A ::を省略できると思いました。これは、名前空間stdを使用するとstd::を省略できるのと同じです。

ええ、そうですが、そうすれば、競争を争うという他のすべてのものもあります。pause

using namespaceこれがしばしば眉をひそめる理由です。

于 2013-02-07T14:06:18.443 に答える
3

エラー メッセージが示すように、usingステートメントを追加した後、グローバル名前空間に複数の名前が付けられています。pauseそのためusing namespace whatever;、グローバル スコープでの使用はお勧めできません。

于 2013-02-07T13:57:13.947 に答える