🐙
Compile Error C2908 explicit specialization;
Compile Error C2908 explicit specialization; 'template' has already been instantiated.(MSVC)
template<class T> class X{};
void f() {
X<int> x;
}
template<> class X<int>{}; // C2908 explicit specialization;
日本語に直訳すると明示的な特殊化をインスタンス化した後にやらないでねってこと.
上の例ではtemplateクラスのインスタンス化をX<int> x
の部分で行っている.
そのあとにX
のint
についての部分的な特殊化を行っているためコンパイルエラー.
ちなみにこれ,同一クラス内で関数定義の順番を間違えた場合にも発生する.
class X {
template<int i> void f();
void g();
};
void X::g() {
f<1>(); // fのテンプレート引数が1についてのインスタンス化
};
template<> void X::f<1>(){}; // fの1についての明示的な特殊化
// C2908
同一クラス内でもインスタンス化と特殊化の順序は逆にできない.
この場合ではg
の定義よりも先にf<1>()
の定義をしておく必要がある.
Discussion