サーチ…
どの機能が見つかったか
関数は、最初に、引数型T
応じて、以下のうちの1つ以上を含む「関連クラス」および「関連する名前空間」の集合を収集することによって検出されます 。まず、クラス、列挙型、およびクラステンプレートの特殊化名の規則を示します。
-
T
がネストされたクラスであれば、メンバーの列挙、その周囲のクラス。 - 場合は
T
列挙です(それはまた 、クラスのメンバかもしれません!)、それの最も内側の名前空間。 - 場合は
T
クラスである(それはまた 、入れ子にすることができる!)、そのすべての基底クラスとクラス自体を。関連するすべてのクラスの最も内側の名前空間。 -
T
がClassTemplate<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);
A
、B
、void(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