2011-08-04 122 views
5

是否有可能以某種方式禁止使用模板化功能的專業化未明確寫入的類型。我的意思是類似的東西塊非專業模板C++

template <typename T> 
void foo(){} 

template <> 
void foo<int>(){} 

int main(int argc, char* argv[]){ 
    foo<int>(); //ok 
    foo<char>(); //Wrong - no specialized version for char. 
} 

我不能跳過的功能通用版本,因爲那樣編譯器說,foo是不是一個模板函數,當我嘗試專業化。我可以簡單地寫一些不能在泛型函數中編譯的東西,並添加一些解釋原因的評論,但這是非常不具信息性的。我想要做的是能夠直接導致編譯器出錯,如「foo()未定義」。

回答

13

肯定的:就是不定義它,如果你嘗試使用它,你會得到一個鏈接錯誤:

template <typename T> 
void foo(); // not defined 

template <> 
void foo<int>() { } 

或者,您可以使用靜態斷言的一些變化給予「更好「編譯時錯誤。這裏是一個使用C++ 0x static_assert的例子。請注意,您必須使false值取決於模板參數,否則static_assert可能會在模板解析時觸發。

template <typename T> 
struct dependent_false { enum { value = false }; }; 

template <typename T> 
void foo() 
{ 
    static_assert(dependent_false<T>::value, "Oops, you used the primary template"); 
} 

注意,它通常是最好的not to specialize function templates。相反,最好委派專門的班級模板:

template <typename T> 
struct foo_impl 
{ 
    static_assert(dependent_false<T>::value, "Oops, you used the primary template"); 
}; 

template<> 
struct foo_impl<int> 
{ 
    static void foo() { } 
}; 

template <typename T> 
void foo() 
{ 
    return foo_impl<T>::foo(); 
} 
4

當然,只是不提供默認通用模板的定義。