나는 이미 SFINAE 관용구를 꽤 많이 사용했으며 리턴 유형이 아닌 템플릿 매개 변수에 내 std::enable_if<>
을 사용했습니다. 그러나, 나는 그것이 작동하지 않는 약간의 사소한 경우를 보았고, 나는 왜 확실하지 않다. 우선, 여기 내 주요 :SFINAE는 반환 형식으로 작동하지만 템플릿 매개 변수로 사용하지 않습니다.
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";
}
그리고 여기에 잘 작동 코드의 가정으로 해당 작품이다 :
다음int main()
{
foo(5);
foo(3.4);
}
오류를 유발하는
foo
의 구현입니다
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> ^
편집 :
좋아. 실제 데모 : [1 차 컴파일에 실패했습니다] (http://ideone.com/mJ8Zp6) 및 [2 번째 성공적으로 컴파일 된 부분] (http://ideone.com/G0jBft). –
추가 정보 : VS 2012 년 11 월 CTP와 동일. –
[This] (http://flamingdangerzone.com/cxx11/2012/06/01/almost-static-if.html)은 당신에게 완벽한 읽을 거리 여야합니다. – Xeo