1

下面我有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 和 VS2012

4

1 回答 1

1

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

您永远不会为第一个模板声明提供定义,这就是如果您不将其他模板声明放入,您会收到“未解决的外部”错误的原因。

如果你把其他人放进去,现在你有其他人之一加上这个作为候选人,两者都是可行的,并且没有排序。这就是为什么您会收到“模棱两可的呼叫”错误。

正确的方法是声明您定义的那些,即,确切地说,您现在未注释的内容。

于 2012-07-18T00:27:25.547 回答