2016-05-24 11 views
0

のためのテンプレート引数を推定できませんでした:私はいくつかの他のクラスを持っているは、私は次のシグネチャで例えば<code>function</code>と呼ばれるシンプルな機能持ってオーバーロードされた関数

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(object); // Compilation error (C2664). 

は、私はテンプレート引数を残すことができます任意の解決策はありますか?

(MSVC 2012)

+0

ここでは推測されないコンテキストのIsnt Tは 'std :: is_base_of < Base, T > :: value'ですか?参考までにここをクリックhttp://stackoverflow.com/questions/25245453/what-is-a-nondeduced-context – marcinj

+0

これはコンパイラの問題ではありません。 Tはこれから推論できないので、コンパイラは成功しません。 –

答えて

4

ネストされた名前指定子(<T>::)を導入することにより、あなたはT上のテンプレート型の控除を阻害します。

template <typename T> 
auto function(const T& aValue) 
    -> typename std::enable_if<std::is_base_of<Base, T>::value, bool>::type 
{ 
    return true; 
} 

またはテンプレート型パラメータリスト内:

あなたは戻り値の型の構文では、例えば、他の場所 enable_ifを置くことによって推定される引数の式のタイプをさせる必要があり、言わ

template <typename T, typename = typename std::enable_if<std::is_base_of<Base, T>::value>::type> 
bool function(const T& aValue) 
{ 
    return true; 
} 
+0

2番目の解決策では、私はこのエラーが発生します。 エラーC4519:デフォルトのテンプレート引数はクラステンプレートでのみ許可されています。これは関数呼び出しのためのものです: 'error C2664: 'function':パラメータ1を 'Derived'から 'const Type' ' –

+0

@ p.i.gに変換できません。使用しているMSVCはこのC++ 11機能をサポートしていません –

+0

回避策はありますか? –

関連する問題