如何使用enable_if<> ::类型返回类型对函数进行原型化?

时间:2012-07-18 00:21:53

标签: c++ templates c++11 sfinae enable-if

下面我有3个原型。我期望第一个(注释掉)工作,但这是工作的唯一一个(参见代码中的注释错误)。对我来说更令人惊讶的是,即使两者都存在,以下任何一项都有效。

/////////////////////////////////////////////////
// Prototypes:
/////////////////////////////////////////////////
//  Causes "ambiguous call to overloaded function" at the call site when when one or both  
//  of the below prototypes is also present. Otherwise causes unresolves external
//template<typename T> void func(); 

//  Okay, can have this one AND/OR the below declaration
template<typename T> typename std::enable_if<std::is_integral<T>::value, void>::type func();

//  Also okay, can have this one AND/OR the above declaration
template<typename T> typename std::enable_if<std::is_integral<T>::value, void>::type func();


int main()
{
    func<int>();
}


/////////////////////////////////////////////////
// Definitions:
/////////////////////////////////////////////////
template<typename T> typename std::enable_if<std::is_integral<T>::value, void>::type func() {}

template<typename T> typename std::enable_if<!std::is_integral<T>::value, void>::type func() {}

哪个是正确的原型,为什么第一个原型不起作用?我正在使用VS2010&amp; VS2012

1 个答案:

答案 0 :(得分:1)

第一个导致错误,因为它声明了一个不同的函数模板。简单地说,它是不同的,因为所有enable_if内容都是其签名的一部分,而不仅仅是它解析的最终类型。

您永远不会为第一个模板声明提供定义,这就是为什么如果您不将其他声明放入其中,则会出现“未解决的外部”错误。

如果你把其他人放进去,现在你有一个 plus 这个作为候选人,并且两者都是可行的,而不是订购的。这就是为什么你得到一个“含糊不清的电话”错误。

正确的方法是声明您定义的那些,即您现在已经取消注释的内容。