🐙

Compile Error C2908 explicit specialization;

2022/11/06に公開

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の部分で行っている.
そのあとにXintについての部分的な特殊化を行っているためコンパイルエラー.

ちなみにこれ,同一クラス内で関数定義の順番を間違えた場合にも発生する.

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>()の定義をしておく必要がある.

引用

  1. Microsoft Learn コンパイルエラー C2908

Discussion