サーチ…


どの機能が見つかったか

関数は、最初に、引数型T応じて、以下のうちの1つ以上を含む「関連クラス」および「関連する名前空間」の集合を収集することによって検出されます 。まず、クラス、列挙型、およびクラステンプレートの特殊化名の規則を示します。

  • Tがネストされたクラスであれば、メンバーの列挙、その周囲のクラス。
  • 場合はT列挙です(それはまた 、クラスのメンバかもしれません!)、それの最も内側の名前空間。
  • 場合はTクラスである(それはまた 、入れ子にすることができる!)、そのすべての基底クラスとクラス自体を。関連するすべてのクラスの最も内側の名前空間。
  • TClassTemplate<TemplateArguments> (これクラスです!)の場合、テンプレート引数に関連付けられたクラスと名前空間、テンプレートテンプレート引数の名前空間、テンプレートテンプレート引数の周囲クラスです。メンバーテンプレート

今や、組み込み型にもいくつかの規則があります

  • 場合TへのポインタであるUまたはアレイU 、クラス、名前空間が関連付けられたU 。例: void (*fptr)(A); f(fptr); void(A)関連する名前空間とクラスを含みvoid(A)次の規則を参照してください)。
  • Tが関数型の場合、パラメータと戻り値の型に関連するクラスと名前空間。例: void(A)にはA関連付けられた名前空間とクラスが含まれます。
  • Tがメンバへのポインタである場合、メンバ型に関連するクラスと名前空間(メンバ関数へのポインタとデータメンバへのポインタの両方に適用されるかもしれない)。例: BA::*p; void (A::*pf)(B); f(p); f(pf); ABvoid(B)関連する名前空間とクラスが含まれています(関数型に対して上記の箇条書きを適用しています)。

関連するすべてのネームスペース内のすべての関数とテンプレートは、引数依存ルックアップによって検出されます。さらに、 関連するクラスで宣言されたnamespace-scopeフレンド関数が見つかります。通常は表示されません。ただし、ディレクティブの使用は無視されます。

次のすべての呼び出し例は、呼び出しの名前空間名でfを修飾することなく、有効です。

namespace A {
   struct Z { };
   namespace I { void g(Z); }
   using namespace I;

   struct X { struct Y { }; friend void f(Y) { } };
   void f(X p) { }
   void f(std::shared_ptr<X> p) { }
}

// example calls
f(A::X());
f(A::X::Y());
f(std::make_shared<A::X>());

g(A::Z()); // invalid: "using namespace I;" is ignored!


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow