2011-10-18 19 views
1

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 *のインスタンスをコピーするのは悪いことかもしれません。

+1

可能な複製:http://stackoverflow.com/questions/3888082/implicit-conversion-not-happening(実際には、暗黙のコンバージョンとテンプレート控除を混在させようとしています)。 – alexisdm

+0

@alexisdmはい、それは私がやろうとしていることです。私はコンパイラが暗黙の変換を行うのに十分な情報を得ると思う。それを指摘していただきありがとうございます。 – Logan

答えて

0

あなたは

Prop<int>* c = MakeProp(FastDelegate0<int>(Getter<int>), FastDelegate1<int>(Setter<int>)); 

を試してみましたか?

Setter<int>FastDelegate1<T>に変換できません!

+0

はい、試しました。できます。 – Logan

+0

正直言って、私は@alexisdmのコメントの "質問"から答えを得ています。しかし、同じことに感謝します。 – Logan

関連する問題