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

时间:2016-05-24 12:27:23

标签: c++ templates c++11

我有一个名为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)

1 个答案:

答案 0 :(得分:4)

通过引入嵌套名称说明符(<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;
}