1

私は次のコードを持っています:

void myfunc() 
{ 
} 
template <typename T> 
void check() 
{ 
} 

template <typename T> 
void checkT (T) 
{ 
    check<T>(); 
} 

したがって、main関数でcheckT(myfunc)thenを呼び出すとコンパイルcheck<myfunc>()されますが、最初のバージョンを直接呼び出しても機能しません。なぜそうなのか説明してもらえますか?エラーは

エラー:「check()」の呼び出しに一致する関数がありません

ありがとう!

4

3 に答える 3

3

これはmyfunc、型ではなく値式であるためです。あなたができる

check<decltype(myfunc)>();

ただし、または同等に:

check<void(void)>();

http://liveworkspace.org/code/2ANEre$0で実際にご覧ください


PS。コメントへの返信として、関数の仮パラメーターとテンプレート型パラメーターの間に少し混乱を感じます。次のように記述して、より明確にします。

template <typename T> 
void checkT (T somevalue) 
{ 
    check<T>();  // note: somevalue is never used!
} 
于 2013-03-18T01:40:14.657 に答える
1

最初のインスタンスcheckT(myfunc)では、タイプを推測でき、checkT実際には同じでcheckT( T value )あり、渡されvalueT推測されています。2 番目のケースでは、タイプを提供していないので、次のように変更して動作させることができます。

check<decltype(myfunc)>() ;

この場合value、 が必要な場所に実際に を提供しています。typevoid(void)

于 2013-03-18T01:42:15.767 に答える
0

checkT(myfunc)値であるため機能myfuncします。しかし、2 番目は、テンプレート パラメーターが必要とする型ではないため、失敗します。例えば、

void checkT(T) 

と同じです

void checkT(T t)

つまり、渡された関数は type のオブジェクトですT。つまり、tはオブジェクトでありT、 はタイプです。のテンプレート パラメータでは、オブジェクトではなく、checkの明示的な指定が必要です。したがって、オブジェクトを渡すとコンパイル エラーが発生します。明示的な型が期待される場所に数値 5 を渡すのと同じです。int

式でラップすることにより、型として使用できますdecltype

check<decltype(myfunc)>();
//    ^^^^^^^^^^^^^^^^
于 2013-03-18T01:45:59.220 に答える