看下面一段代码:
template<typename returnvalue_t>
struct funcptrtraits
{
typedef returnvalue_t (*type)(int,int);
};
template<typename returnvalue_t>
void makefuncptr(typename funcptrtraits<returnvalue_t>::type arg1)
{
//do something
};
int test(int x,int y)
{
return (x + y);
};
int main()
{
makefuncptr(test);
return 0;
};
用vc.net编译上面这段代码会出错:c2783,“declaration”: 未能推导出“identifier”的模板参数。
我想要让编译器能推导出函数模板的模板参数,必须在函数的参数类型声明中直接使用模板参数,我所谓的直接使用,是指用来推导模板参数的函数参数类型定义不应该再使用某个类模板中的嵌套类型定义。如果象以上那样间接的使用,不够聪明的编译器就无能为力了。