dup質問かもしれません。しかし、私は答えを見つけることができません。 FastDelegate
は、http://www.codeproject.com/KB/cpp/FastDelegate.aspxを参照していますが、関連はないと思います。テンプレート関数を呼び出すときにC++のテンプレートを差し引く
次のようなコードがあり、エラーが発生しました。
#include <FastDelegate.h>
using namespace fastdelegate;
template <typename T>
T Getter() {}
template <typename T>
void Setter(T) {}
template <typename T>
class Prop
{
public:
typedef FastDelegate0<T> Getter;
typedef FastDelegate1<T> Setter;
Prop(Getter getter, Setter setter) :
m_Getter(getter), m_Setter(setter)
{
}
private:
Getter m_Getter;
Setter m_Setter;
};
template <typename T>
inline Prop<T>* MakeProp(FastDelegate0<T> getter, FastDelegate1<T> setter)
{
return new Prop<T>(getter, setter);
}
static int Target = 0;
int main()
{
FastDelegate0<int> fdGetter(Getter<int>);
Prop<int>* c = MakeProp(fdGetter, Setter<int>); // error: no matching function for call to 'MakeProp'
}
にmain()
を変更した場合:FastDelegate1<int>
のコンストラクタと呼ばれるよりもMakeProp()
がint
あるfdGetter(からT
を取得する必要があり、私が思う
int main()
{
FastDelegate0<int> fdGetter(Getter<int>);
Prop<int>* c = MakeProp<int>(fdGetter, Setter<int>); // It works, too.
}
:
int main()
{
FastDelegate0<int> fdGetter(Getter<int>);
FastDelegate1<int> fdSetter(Setter<int>);
Prop<int>* c = MakeProp(fdGetter, fdSetter); // It works.
}
かなぜですか?
P.S.ゲッターとセッターをProp
に保存したいのですが、このアプローチの提案は大歓迎です。ファンクションで引数を渡している間にFastDelegate *のインスタンスをコピーするのは悪いことかもしれません。
可能な複製:http://stackoverflow.com/questions/3888082/implicit-conversion-not-happening(実際には、暗黙のコンバージョンとテンプレート控除を混在させようとしています)。 – alexisdm
@alexisdmはい、それは私がやろうとしていることです。私はコンパイラが暗黙の変換を行うのに十分な情報を得ると思う。それを指摘していただきありがとうございます。 – Logan