9

名前空間内の関数は、名前空間のスコープを使用するか、ディレクティブを使用してのみアクセスできるべきではありませんか?

名前空間内で定義された特定の関数が、その名前空間の外でアクセスできるという問題があります。コンパイラ エラーがあるはずですが、試した 3 つの異なるコンパイラ (VS.NET 2003、VS2010、および GCC 4) でエラーが発生しません。

コードは次のとおりです。

namespace N{
  typedef struct _some_type *some_type;
  struct some_struct { int x; };
  void A(void);
  void B(int);
  void C(some_type*);
  void D(some_type);
  void E(struct some_struct);
}

using N::some_type;
using N::some_struct;

void TestFunction()
{
  some_type foo;
  some_struct s;

  N::A();         //should compile (and does on VS2003, VS2010, and GCC 4.1.2)
  ::A();          //shouldn't compile (and doesn't on VS2003, VS2010, and GCC 4.1.2)
  A();            //shouldn't compile (and doesn't on VS2003, VS2010, and GCC 4.1.2)

  N::B(0);        //should compile (and does on VS2003, VS2010, and GCC 4.1.2)
  ::B(0);         //shouldn't compile (and doesn't on VS2003, VS2010, and GCC 4.1.2)
  B(0);           //shouldn't compile (and doesn't on VS2003, VS2010, and GCC 4.1.2)

  N::C(&foo);     //should compile (and does on VS2003, VS2010, and GCC 4.1.2)
  ::C(&foo);      //shouldn't compile (and doesn't on VS2003, VS2010, and GCC 4.1.2)
  C(&foo);        //shouldn't compile (but does on VS2003, VS2010, and GCC 4.1.2) -- problem!

  N::D(foo);      //should compile (and does on VS2003, VS2010, and GCC 4.1.2)
  ::D(foo);       //shouldn't compile (and doesn't on VS2003, VS2010, and GCC 4.1.2)
  D(foo);         //shouldn't compile (but does on VS2003, VS2010, and GCC 4.1.2) -- problem!

  N::E(s);        //should compile (and does on VS2003, VS2010, and GCC 4.1.2)
  ::E(s);         //shouldn't compile (and doesn't on VS2003, VS2010, and GCC 4.1.2)
  E(s);           //shouldn't compile (but does on VS2003, VS2010, and GCC 4.1.2) -- problem!
}

N:: プレフィックスを使用せずにアクセスできる関数はありませんが、C、D、および E は何らかの理由で不明です。最初はコンパイラのバグだと思っていましたが、複数のコンパイラでこれを見ているので、何が起こっているのか疑問に思います.

4

1 に答える 1

14

Koenig lookupの効果を見ていると思います。あなたの例では、fooandsは namespace で定義された型Nです。ルーチンCD、およびへの呼び出しはこれらの型の引数を使用するため、それらの関数呼び出しを解決するためにE名前空間が検索されます。N

于 2012-05-01T23:20:45.737 に答える