调用模板函数时的模板演绎

C++ Template deduction while calling a template function

本文关键字:演绎 函数 调用      更新时间:2023-10-16

FastDelegate指http://www.codeproject.com/KB/cpp/FastDelegate.aspx,但我不认为这是相关的。

我有如下代码,并得到错误。

#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()应该从fgetter(即int)中获取T,而不是自动调用FastDelegate1<int>的构造函数。但事实并非如此。为什么?

注:我希望将getter和setter保存在Prop中,欢迎对这种方法提出任何建议。也许在函数中传递参数时复制FastDelegate*的实例是不好的。

你试过了吗

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

?

Setter<int>不能转换为FastDelegate1<T> !