2011-02-02 13 views

答えて

12

これは専門です。 template<>は、専門化自体がテンプレート化されていないことを意味します。つまり、部分的な専門化ではなく明示的な特殊化です。

+0

「テンプレート<」は特殊化自体がテンプレート化されていないことを意味します。これは、特定の例だけに適用されるため、完全には正しくありません。たとえば、次のようになります。 'template struct A {template void f(); };テンプレート<>テンプレート void A :: f(){} '。この他の例では、メンバーの明示的な特殊化はそれ自体がテンプレートです。 (ちょっとニックピッキングだけど、知っておくことが大切です)。 –

+0

私は答えを理解していません。あなたはそれが部分的なものと特別なものとをどのように区別しているかを見せかけることができますか? – wallyk

4

これは必須の構文だと言うかもしれません。

通常の構文はtemplate< typename T > struct Allowedです。

私たちは、この場合にはTがSTDであることを知っているので::文字列を角括弧の内側に置くことは何もなく、Wordテンプレートはありませんし、独自に struct Allowed<std::string>を書くことは、あなたがしていることを意味するものではないので、角括弧がまだ必要とされますテンプレートを専門にしていますが、単に型としてstd :: stringをインスタンス化しているだけです。 ( "struct"という言葉はそれをする必要はありませんが、まだ許可されています)。

10

テンプレートの特殊化です。典型的なケースは、部分的な特殊次のようになります。あなたが見ることができるように、専門は、テンプレートパラメータから一つの要素を削除し、明示的に代わりに取り除か1のタイプを述べ

#include <iostream> 

template<class T1, class T2> struct foo 
{ 
    void doStuff() { std::cout << "generic foo "; } 
}; 

template<class T1> 
struct foo<T1, int> 
{ 
void doStuff() { std::cout << "specific foo with T2=int"; } 
}; 

。つまり、テンプレートタイプが1つだけの場合は、

template<class T1> struct bar 
{ 
    void doStuff() { std::cout << "generic bar"; } 
}; 

template<> 
struct bar<int> 
{ 
void doStuff() { std::cout << "specific bar with T1=int"; } 
}; 
関連する問題