私は次のコードを記述する場合、それがコンパイルされ、正常に実行されます:グローバルスコープとローカルスコープでディレクティブの動作が異なるのはなぜですか?
#include <iostream>
using namespace std;
namespace first
{
int x = 5;
int y = 10;
}
namespace second
{
double x = 3.1416;
double y = 2.7183;
}
int main() {
using namespace first; //using derective
using second::y;
cout << x << endl;
cout << y << endl;
return 0;
}
しかし、私は次のように、
using namespace first; //using derective
using second::y;
int main() {
cout << x << endl;
cout << y << endl;
return 0;
}
をメイン関数外のディレクティブを使用して書く場合には、このコンパイルエラーを与える:
g++ namespace03.cpp -o namespace03
namespace03.cpp: In function ‘int main()’:
namespace03.cpp:20:11: error: reference to ‘y’ is ambiguous
namespace03.cpp:13:10: error: candidates are: double second::y
namespace03.cpp:7:7: error: int first::y
make: *** [namespace03] Error 1
main
との内側でディレクティブを使用すると違った動作をする理由を誰でも説明できます?
速い返信のためにJesseに感謝します...私が間違っていれば私を修正してください...しかし、ディレクティブを使用しているときにはまだ主要な機能に2つの宣言があります。もしそうなら、なぜコンパイラは2番目のケースでのみ問題を起こすのですか? – Amrit
@ user2235938: 'y'の宣言は2つありますが、using宣言はmainの中で' second :: y'を宣言し、 'first :: y'はグローバル名前空間のスコープで宣言します。 'second :: y'はmainの中で宣言されているので、' first :: y'を隠します。あなたは名前の隠れに慣れていますか? –
申し訳ありませんJesse ...しかし、私は理解できません。両方のステートメントが "名前空間を最初に使用する; 第2の:: y;を使用する主な関数の中にある場合は、ローカルスコープ内の最初の:: yと2番目の:: yの両方を宣言し、コンパイルエラーを返さなければなりません。しかし、プログラムはコンパイルされず、正常に実行されません。そして、両方のステートメントがメインの外側にあるときには、あいまいさのためにコンパイルされません。親切に説明してください... – Amrit