调用模板函数时的模板演绎
C++ Template deduction while calling a template function
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>
!
相关文章:
- 使用显式模板参数列表和 [temp.arg.explicit]/3 的函数调用的演绎失败
- 提升精神 QI:在元组上自动规则演绎,在替代函数中带有序列
- 如何使用模板化构造函数定义演绎指南?
- 演绎指南和具有可变参数模板构造函数的可变参数类模板 - 参数包长度不匹配
- 可变参数模板构造函数的演绎指南失败
- 模板作为函数模板的参数 - 演绎失败
- c++ 11使用std::函数进行类型演绎
- 成员函数指针的模板实参演绎
- 错误:没有匹配的函数调用[…]注意:模板参数演绎/替换失败
- c++如何在无法进行类型演绎时调用模板化构造函数
- 函数模板中返回类型的模板实参演绎
- 调用模板函数时的模板演绎
- 类型演绎模板函数c++
- 用演绎的类型公开类成员函数
- 括号初始化列表和函数模板类型演绎顺序
- 在模板演绎中保持函数指针形参的完整类型
- 用const实参重载实参演绎的c++模板函数
- 定义任何成员函数指针的别名中的模板实参演绎
- 在类型演绎之后,函数模板中的替换顺序是否有任何保证
- c++中转换函数模板实参演绎的含义