Ich habe das SFINAE-Idiom schon einige Male benutzt und ich habe mich daran gewöhnt, meine std::enable_if<>
in Template-Parameter anstatt in Rückgabetypen zu setzen. Ich stieß jedoch auf einen trivialen Fall, in dem es nicht funktionierte, und ich bin mir nicht sicher warum. Zunächst einmal ist da, mein Haupt:SFINAE funktioniert im Rückgabetyp, aber nicht als Template-Parameter
int main()
{
foo(5);
foo(3.4);
}
Hier eine Implementierung von foo
ist, dass der Fehler auslöst:
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";
}
Und hier ist ein angeblich gleichwertig Stück Code, das funktioniert gut:
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";
}
Meine Frage ist: Warum löst die erste Implementierung von foo
diesen Fehler aus, während der zweite es nicht auslöst?
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> ^
EDIT:
Working code und faulty code.
Ok. Tatsächliche Demonstration: [1. Teil konnte nicht kompiliert werden] (http://ideone.com/mJ8Zp6) und [2. erfolgreich kompilierter Teil] (http://ideone.com/G0jBft). –
Zusätzliche Informationen: gleich mit VS 2012 November CTP. –
[This] (http://flamingdangerzone.com/cxx11/2012/06/01/almost-static-if.html) sollte das perfekte Buch für Sie sein. – Xeo