工作在返回類型但不作為模板參數(shù)的SFINAE我已經(jīng)用了很多次SFINAE的成語,我習(xí)慣了把我的std::enable_if<>在模板參數(shù)中,而不是在返回類型中。然而,我遇到了一些瑣碎的情況,它不起作用,我不知道為什么。首先,這是我的主要:int main(){
foo(5);
foo(3.4);}下面是foo觸發(fā)錯(cuò)誤: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";}我的問題是:為什么第一次執(zhí)行foo觸發(fā)該錯(cuò)誤,而第二個(gè)錯(cuò)誤不觸發(fā)?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>
^編輯 :工作代碼和錯(cuò)誤碼.
請(qǐng)問工作在返回類型但不作為模板參數(shù)的SFINAE
哆啦的時(shí)光機(jī)
2019-08-01 13:01:16