无法推断重载函数的模板参数

Could not deduce template argument for overloaded function

本文关键字:参数 函数 重载      更新时间:2023-10-16

例如,我有一个名为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;
}