如何使用 enable_if<>::type 返回类型对函数进行原型设计?
How do you prototype a function with an enable_if<>::type return type?
下面我有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
第一个导致错误,因为它声明了不同的函数模板。简单地说,它是不同的,因为所有的enable_if
事物都是其签名的一部分,而不仅仅是它解析为的最终类型
你从来没有为第一个模板声明提供定义,这就是为什么如果你不把其他的放进去,你会得到一个"未解决的外部"错误
如果你把其他的放进去,现在你有一个其他的加上这个作为候选,两者都是可行的,并且没有顺序。这就是为什么会出现"模糊调用"错误的原因。
正确的方法是声明您定义的,也就是说,准确地声明您现在取消注释的内容。
相关文章:
- 函数如何通知用户它基于函数原型抛出异常?
- 在函数中拥有函数原型的目的是什么?
- 什么..(省略号)作为函数原型中唯一的函数参数,C++?
- 是否可以使用 libclang python 解析 cpp 文件中没有标头的函数原型
- 有没有办法在C++编译时更改函数原型?
- 省略函数原型中的返回类型
- 如何使用 "using" 关键字定义函数原型/签名
- 函数原型未初始化的局部变量
- 如何创建函数原型命名空间
- 标准库头文件函数原型的实现是如何用 c++ 编写的?
- 为什么这种类型的函数原型会引发错误?
- 函数指针类型不能用于函数原型
- 了解此函数原型
- 将字符串向量传递给函数和函数原型问题 c++
- 函数原型范围的有趣用法
- 为什么这不起作用(C++函数原型)
- 将数组传递到函数会在函数原型声明中出现错误
- 在头文件中的函数原型中获取指针数组:函数声明为 void
- 类/成员函数中的函数原型
- 函数原型中的字符串初始化