工作在返回类型但不作为模板参数的SFINAE我已经用了很多次SFINAE的成语,我习惯了把我的std::enable_if<>在模板参数中,而不是在返回类型中。然而,我遇到了一些琐碎的情况,它不起作用,我不知道为什么。首先,这是我的主要: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>
^编辑 :工作代码和错误码.
3 回答
慕后森
TA贡献1802条经验 获得超5个赞
14.5.6.1 Function template overloading
冉冉说
TA贡献1877条经验 获得超1个赞
template<typename T, typename std::enable_if<std::is_integral<T>::value, int>::type = 0>auto foo(T) -> void{ std::cout << "I'm an integer!\n";}template<typename T, typename std::enable_if<std::is_floating_point<T>::value, int>::type = 0>auto foo(T) -> void{ std::cout << "I'm a floating point number!\n";}
- 3 回答
- 0 关注
- 443 浏览
添加回答
举报
0/150
提交
取消