无法推断重载函数的模板参数
Could not deduce template argument for overloaded function
例如,我有一个名为function
的简单函数,具有以下签名:
class Type { /* ... */ };
bool function( const Type& aValue ) { /* ... */ return true; }
我还有一些其他类,我想重载提到的函数,以便只有派生自Base
的类可以使用它:
class Base { /* ... */ };
class Derived : public Base { /* ... */ };
template < typename T >
bool function( const typename std::enable_if< std::is_base_of< Base, T >::value, T >::type& aValue ) { /* ... */ return true; }
如果我像这样使用它,它工作正常:
Derived object;
function< Derived >( object );
但是如果我离开模板参数,我会得到提到的错误(无法推断模板参数):
Derived object;
function( object ); // Compilation error (C2664).
有什么解决方案可以让我留下模板参数吗?
(MSVC 2012)
通过引入嵌套名称说明符 ( <T>::
),您可以禁止在T
上推导模板类型。
也就是说,您必须通过将enable_if
放在其他地方来推断参数表达式类型,例如,在返回类型语法中:
template <typename T>
auto function(const T& aValue)
-> typename std::enable_if<std::is_base_of<Base, T>::value, bool>::type
{
return true;
}
或在模板类型参数列表中:
template <typename T, typename = typename std::enable_if<std::is_base_of<Base, T>::value>::type>
bool function(const T& aValue)
{
return true;
}
相关文章:
- 将可变参数函数的参数封装在类实例中
- QML 使用带有参数C++函数
- 使用可变参数函数作为模板参数
- 如何在C++中伪造虚拟可变参数函数模板?
- 为什么可变参数函数不适用于模板
- C++ std::functional 中的可变参数函数模板
- 可变参数函数指针的定义对于VxWorks spyLib来说不清楚
- 使用可变参数函数覆盖具有不同函数签名的虚函数
- 考虑引用和常量的可变参数函数包装器
- 使用可变参数函数将整数和/或整数数组放入单个 int 数组中
- 在可变参数函数中转发特定范围的参数
- 通过引用传递参数;函数返回类型是否必须为 VOID?
- 使用带有一个参数函数的递归找到数字的平方
- 可变参数函数模板不能很好地使用 std::function 作为参数
- 多个可变参数函数的单个模板参数包?
- 参数数据类型未知的可变参数函数
- 可变参数函数参数包扩展
- 使用模板可变参数函数将多个参数传递给另一个函数
- 对可变参数函数的递归调用的链接器错误
- 通过像printf这样的可变参数函数传递一个带有常量字符*转换函数的类