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
我在哪裏錯了?
http://en.cppreference.com/w/cpp/language/sfinae'此規則適用於函數模板的重載解析期間。你的職能不是模板,你的職業是。 – tkausl
@tkausl對,看起來很合理。雖然在類模板中有使用SFINAE的例子,例如:http://en.cppreference.com/w/cpp/types/enable_if,例子中main()之前的最後一行。那麼,爲什麼我不能將它用於方法專業化? –
main之前的行是類本身的部分特化,而不是其成員函數之一。 http://stackoverflow.com/questions/15374841/c-template-partial-specialization-member-function可能會有所幫助。 – tkausl