6

もっとテンプレート化された問題... 私は C++ が大好きですが、時々嫌いです。

コンパイラがここで不平を言っている理由と、それに対して何ができるかわかりません。

struct blah
{
   template<class t>
   blah(void(*)(t), t){}
};

void Func(int i) {}
void Func2(int& i) {}

void test()
{
   int i = 3;
   blah b(Func, i);   
   blah b2(Func2, i);        //error C2660: 'blah::blah' : function does not take 2 arguments
   blah b3(Func2, (int&)i);  //error C2660: 'blah::blah' : function does not take 2 arguments

}

ここで何が起こっているのですか?

MSVC2008を使用しています。

4

3 に答える 3

7

他の答えは何が起こっているかを説明しています: テンプレート実引数演繹がテンプレート実引数を推測する 2 つの方法を見つけた場合、それぞれを単独で見て、それらはすべて正確に一致する必要があります。

tの 2 番目の使用が「推定されないコンテキスト」にあることを確認することで、おそらくこのクラスを意図したとおりに動作させることができます。

template<typename T>
struct identity { typedef T type; };

struct blah
{
   template<class t>
   blah(void(*)(t), typename identity<t>::type){}
};

このようにして、blahコンストラクターが呼び出されると、C++ はt関数ポインターから推測しますが、2 番目の引数から推測しようとしません。推定された型は、両方の場所で置換されます。

于 2013-06-28T17:44:22.213 に答える