2012-09-10

明示的特殊化のややこしさ

クラステンプレートは、明示的特殊化できる。クラステンプレートのメンバーは、明示的特殊化できる。このとき、クラステンプレートの明示的特殊化のメンバーの定義と、クラステンプレートのメンバーの明示的特殊化が、似ているのに微妙に違うので、非常にややこしい。

// プライマリークラステンプレート
template < typename T >
struct X
{
    void f() ;
} ;

// プライマリークラステンプレートのメンバーの定義
template < typename T >
void X<T>::f() { }


// クラステンプレートの明示的特殊化
template < >
struct X<int>
{
    void f() ;
} ;

// 上記のクラステンプレートの明示的特殊化のメンバーの定義
// 明示的特殊化ではない
// template < >を記述するとエラー
void X<int>::f() { } 


// クラステンプレートのメンバーの明示的特殊化
// template < >の記述が必要。
template < >
void X<char>::f() { }

方や明示的特殊化ではなく、方や明示的特殊化なので、このような違いが出るのだが、はために見ると非常に似ていて、ややこしい。

No comments:

Post a Comment

You can use some HTML elements, such as <b>, <i>, <a>, also, some characters need to be entity referenced such as <, > and & Your comment may need to be confirmed by blog author. Your comment will be published under GFDL 1.3 or later license with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.