1
template<typename T>
class C
{
   void f() { }
};

/*template<typename T>
void C<T*>::f() { }*/

template<>
void C<int*>::f() { }

コメントを削除すると、コードはコンパイルされません。partial specialization私はこれを知っています(そして、私たちが を持っているべきであることも知ってC<T*>います)が、そのような動作を説明する標準の単語を見つけることができません。私14 parは標準を数回読み直しました。これを説明する見積もりまたは基準値を教えていただけますか?

編集。

template<typename T>
class C
{
   template<typename U>
   struct S { };
};
// #1
/*template<typename T>
class C<T*>
{
   template<typename U>
   struct S { };
};*/
// #2
/*template<typename T>
template<typename U>
struct C<T*>::S<U*> { };*/

template<>
template<typename U>
struct C<int*>::S<U*> { };

次にコメントのみを削除すると、#2 - コードはコンパイルされません。

4

1 に答える 1

1

14.7.3 /1 から、明示的に特殊化できるものについての標準的な引用を次に示します。

次のいずれかの明示的な特殊化:

— 関数テンプレート

— クラステンプレート

クラス テンプレートのメンバ関数

— クラス テンプレートの静的データ メンバー

— クラス テンプレートのメンバ クラス

— クラス テンプレートのメンバ列挙

— クラスまたはクラス テンプレートのメンバ クラス テンプレート

— クラスまたはクラス テンプレートのメンバ関数テンプレート

によって導入された宣言によって宣言できますtemplate<>;

明示的に許可されていない限り、何かを部分的に特殊化することはできず、クラス テンプレートのメンバー関数は明示的に許可されていません。部分的に特殊化できるのはクラス テンプレートのみです (14.5.5 で説明)。

(明示的に特殊化されたクラス テンプレートのメンバー クラス テンプレートは、それ自体がクラス テンプレートであることに注意してください。)

于 2012-09-09T15:14:34.957 に答える