2 に答える
これはA
、型パラメーターを受け入れると呼ばれるクラス テンプレートがありB
、型引数として型を使用してそのテンプレートをインスタンス化することを意味します。
次に、そのクラス テンプレートは、(1)文字列リテラルから変換可能な型のオブジェクトを受け入れる静的メンバー呼び出し可能オブジェクト(通常の関数の場合もある)、または (2)型の型エイリアスを定義します。文字列リテラルから構築可能です(その場合、そのタイプの一時的なものを構築しています)。c
c
どちらの場合も、名前空間内で定義されたエンティティにアクセスするために使用A
するのと同じスコープ解決演算子 ( ::
) を使用して、クラス テンプレート内で定義されたエンティティにアクセスします (結局のところ、クラスと名前空間の両方がスコープを定義します)。
(1)の例として(ライブの例):
#include <iostream>
struct B { };
template<typename T>
struct A
{
static void c(const char* s) { std::cout << s; }
};
int main()
{
A<B>::c("d");
}
(1)関数ではなく呼び出し可能なオブジェクトを使用する別の例として( live example):
#include <iostream>
struct B { void operator () (const char* c) { std::cout << c; } };
template<typename T>
struct A
{
static T c;
};
template<typename T>
T A<T>::c;
int main()
{
A<B>::c("d");
}
(2)の例として(ライブの例):
#include <iostream>
struct B { B(const char* s) { std::cout << s; } };
template<typename T>
struct A
{
typedef T c;
};
int main()
{
A<B>::c("d");
}
スコープ解決演算子 ::
は、名前空間と完全修飾メンバーの両方で使用されます。
あなたの例では、テンプレート クラスによって公開された静的メソッドc()
のように見えます。静的メンバーは、クラス外でアクセスするときに完全修飾する必要があります。A<B>
他の人が正しく指摘しているように、c
は、呼び出し可能な静的メンバー (たとえば、 をオーバーライドする型のインスタンスoperator()(const char *)
)、または から構築可能な型へのエイリアス、または から構築可能const char *
なパブリックclass
またはstruct
ネストされた in にA<B>
することもできconst char *
ます。
(後者の 2 つのケースでは、作成されたインスタンスはどこにも格納されないため、その型のコンストラクターはその副作用のためにのみ呼び出されます。)