我想问一下使用SFINAE的函数重载。我定义了2个函数,其中一个函数应该在整数类型作为参数传递时使用,另一个函数应该在浮点作为参数传递时使用。这是代码:
template <typename T, typename If<IsIntegral<T>::value,T>::Type = 0>
void function(T t) {
std::cout << "T is integral type" << std::endl;
}
template <typename T, typename If<IsReal<T>::value,T>::Type = 0>
void function(T t) {
std::cout << "T is real type" << std::endl;
}
编译好。当我实例化函数的积分版本时,如:
function(4);
function(28l);
它仍然可以正常工作(我收到消息&#34; T是整数类型&#34;)。但是,当我为浮点类型添加另一个实例时:
function(4);
function(28l);
function(4.5f);
我得到错误说,没有匹配的函数可以调用&#34; function(float)&#34;。这段代码有什么问题?顺便说一下,If模板类只是enable_if的别名。
答案 0 :(得分:3)
嗯,您不能将float
类型的常量作为模板参数。
尝试class=typename If<IsRead<T>::value,T>::Type
和其他情况下的类似作为第一次传递。
如果您使用的是C ++ 11,请尝试使用using
别名来清除typename
垃圾邮件。此外,在发布问题寻求帮助时,请更喜欢std::enable_if<?>
到If<?>
,因为我必须猜测 If
做了什么(而且据我所知,你真实的问题在于If
和IsReal
等的实施。