2016-10-04 84 views
0

我有一些方法,比如說,foo一個模板類。我想爲所有POD類型的此方法指定一個默認行爲,併爲其他類型引入單獨的特化。 (真正的問題更復雜,但是這是一個MWE。)我試圖用SFINAE以通常的方式做到這一點。SFINAE基於模板的方法專業化

template<typename T> 
class C { 
public: 
    void foo(T t); 
}; 

template<typename T> 
typename std::enable_if< 
     std::is_pod<T>::value, 
     void>::type 
C<T>::foo(T t) { 
    // do something 
} 

即使使用這樣的代碼(即不製造的C任何情況下),我得到了一個錯誤:

prototype for ‘typename std::enable_if<std::is_pod<_Tp>::value, void>::type C<T>::foo(T)’ does not match any in class ‘C<T>’ 

這似乎很奇怪我,因爲無論是這兩種方法的類型是void或第二一個被SFINAE淘汰。

更重要的是奇怪的,如果我更換內enable_if的條件與false,我得到這表明SFINAE不會在所有的工作的錯誤:

error: ‘type’ in ‘struct std::enable_if<false, void>’ does not name a type 

我在哪裏錯了?

+0

http://en.cppreference.com/w/cpp/language/sfinae'此規則適用於函數模板的重載解析期間。你的職能不是模板,你的職業是。 – tkausl

+0

@tkausl對,看起來很合理。雖然在類模板中有使用SFINAE的例子,例如:http://en.cppreference.com/w/cpp/types/enable_if,例子中main()之前的最後一行。那麼,爲什麼我不能將它用於方法專業化? –

+1

main之前的行是類本身的部分特化,而不是其成員函數之一。 http://stackoverflow.com/questions/15374841/c-template-partial-specialization-member-function可能會有所幫助。 – tkausl

回答

1

要應用SFINAE,標識符必須是模板並且必須包含替換。因爲foo不是一個模板

第一種情況失敗。

第二種情況爲失敗同樣的原因,但由於沒有替代的參與。