2011-10-18 110 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()到:

int main() 
{ 
    FastDelegate0<int> fdGetter(Getter<int>); 
    FastDelegate1<int> fdSetter(Setter<int>); 
    Prop<int>* c = MakeProp(fdGetter, fdSetter); // It works. 
} 

或:

int main() 
{ 
    FastDelegate0<int> fdGetter(Getter<int>); 
    Prop<int>* c = MakeProp<int>(fdGetter, Setter<int>); // It works, too. 
} 

我认为,MakeProp()应该得到fdGetter(这是intT,比所谓的FastDelegate1<int>的构造器但它没有,为什么?

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