1. 程式人生 > >C++:“函式模板“中對“非型別引數”作偏特化時遇到的問題

C++:“函式模板“中對“非型別引數”作偏特化時遇到的問題

在使用 “函式模板“對“非型別引數”作偏特化時遇到編譯報錯的問題,程式碼及報錯資訊如下

template<typename T, int size>
void toStr() {
    cout << "1.---------------------" << endl;
};

template<typename T>
void toStr<T, 2>() {    // error C2768: 'toStr': illegal use of explicit template arguments
    cout << "2.---------------------" << endl;
};

template<>
void toStr<int, 3>() {
    cout << "3.---------------------" << endl;
};

int main() {
    toStr<int>();
    toStr<int, 1>();
    toStr<int, 3>();

    return 0;
}

報錯的原因是函式模板對偏特化缺少支援造成的,把經上程式碼改為使用類模板就沒有問題了:

template<typename T, int size = 0>
struct X {
    static void toStr() {
        cout << "1.---------------------"  <<endl;
    };
};

template<typename T>
struct X<T, 1>{
    static void toStr() {
        cout << "2.---------------------" << endl;
    };
};

template<>
struct X<bool, 2> {
    static void toStr() {
        cout << "3.---------------------" << endl;
    };
};

 

參考文件

Why Not Specialize Function Templates?

為什麼我們不建議使用函式模板具體化