我已經使用了SFINAE成語很多次,我習慣於把我的std::enable_if<>
放在模板參數中而不是返回類型中。但是,我遇到了一些無效的小事,我不知道爲什麼。首先,這裏是我的主:SFINAE工作返回類型,但不作爲模板參數
int main()
{
foo(5);
foo(3.4);
}
這裏是foo
實現觸發錯誤:
template<typename T,
typename = typename std::enable_if<std::is_integral<T>::value>::type>
auto foo(T)
-> void
{
std::cout << "I'm an integer!\n";
}
template<typename T,
typename = typename std::enable_if<std::is_floating_point<T>::value>::type>
auto foo(T)
-> void
{
std::cout << "I'm a floating point number!\n";
}
這裏是一個假想相當於一段代碼,正常工作:
template<typename T>
auto foo(T)
-> typename std::enable_if<std::is_integral<T>::value>::type
{
std::cout << "I'm an integrer!\n";
}
template<typename T>
auto foo(T)
-> typename std::enable_if<std::is_floating_point<T>::value>::type
{
std::cout << "I'm a floating point number!\n";
}
我的問題是:爲什麼foo
的第一次執行會觸發該錯誤,而第二個不會觸發該錯誤?
main.cpp:14:6: error: redefinition of 'template<class T, class> void foo(T)' auto foo(T) ^ main.cpp:6:6: note: 'template<class T, class> void foo(T)' previously declared here auto foo(T) ^ main.cpp: In function 'int main()': main.cpp:23:12: error: no matching function for call to 'foo(double)' foo(3.4); ^ main.cpp:6:6: note: candidate: template<class T, class> void foo(T) auto foo(T) ^ main.cpp:6:6: note: template argument deduction/substitution failed: main.cpp:5:10: error: no type named 'type' in 'struct std::enable_if<false, void>' typename = typename std::enable_if<std::is_integral<T>::value>::type> ^
編輯:
確定。實際演示:[第一次未能編譯部分](http://ideone.com/mJ8Zp6)和[第二次成功編譯部分](http://ideone.com/G0jBft)。 – 2013-03-15 08:34:20
附加信息:與2012年11月份的CTP相同。 – 2013-03-15 08:45:44
[This](http://flamingdangerzone.com/cxx11/2012/06/01/almost-static-if.html)應該是您的完美閱讀。 – Xeo 2013-03-15 09:04:30