-1

以下のコードはコンパイルエラーを与えます

namespace X{
  int i;
}

void f(){

  int i;
  using X::i;  //compile error 'i’ is already declared in this scope

}

しかし、この行を名前空間 X を使用して置き換えると、正常にコンパイルされます。誰かが違いを理解するのを助けることができますか.

また、以下の変更されたコードでは、X::I の出力がすべての場所で 100 になることを期待していましたが、そうではありません。

名前空間の概念を誤解している可能性がありますか?

namespace X{
  int i;
}

void f(){
  int i=1;
  cout << "local I " << i << endl;  // prints 1 OK
  using namespace X;
  i=100;
  cout << "X::i " << i << endl;   // prints 100 OK. 
  cout << "X::i " << X::i << endl; // prints 10 why ?
}

main(){
  using namespace X;
  i=10;
  f();
  cout << "X::i " << i << endl; //prints 10 why ?
}

私がこれを理解するのを手伝ってくれてありがとう。

4

3 に答える 3

2

main()

using namespace X;
i = 10;

これはX::i10 に設定されます。

なぜ?

だからこそ^^

また、 in : shadowsというf()名前の別のローカル変数があるため、それぞれ 1 と 100 に解決され、その名前空間を明示的に指定することによってのみ、名前空間内の他の変数にアクセスできます。i X::iiX

于 2013-03-17T21:30:15.813 に答える
1

「名前空間Xを使用して」と言うと...

変数「i」がXで定義されている場合、変数「i」へのすべての参照について、コンパイラーはそれを「X::i」に置き換えます。したがって、main()で、i = 10と言うと、X::iが10に設定されます。

f()で..。

iという新しい変数を作成します。これはX::iとは異なります。iを1に設定します。次に、名前空間Xの使用を開始します。ただし、名前空間の競合があります。「i」と言う場合、ローカルの「i」またはX :: iを使用する必要がありますか?C ++コンパイラは、変数'i'をLOCALiで識別することにより、このようなケースを処理します。関数にはすでにiが定義されているため、名前空間に別のi(i)を導入することはできません。したがって、X :: iを参照するには、「X::i」と明示的に言う必要があります。それ以外の場合は、ローカルiについて話していると見なされます。

最初の例では、X :: iを使用すると言うとき、コンパイラーに多くの選択肢を与えていません。あなたは<私はX::i'i'を呼び出したい>と言っています。ただし、これを行うことはできません。「i」がすでに定義されているためです。コンパイラにこれを強制すると、同じ名前の2つの異なる変数が生成されます。これは発生しません。

うまくいけば、これは物事を少し明確にしました。追加の質問でコメントします。

于 2013-03-17T21:37:03.230 に答える
0

ステートメントは、特定のusing X::i名前をスコープに導入します。どうやら、その名前iはすでに使用されているため、再度使用することはできません。
実際、ネームスペースは名前の競合を避けるために使用されます。このような短い名前では、名前空間は実際にはやり過ぎです。

于 2013-03-17T21:30:38.037 に答える