xml*_*lmx 16 c++ templates c++11
下面的代码被VC++ 2012拒绝,"错误C2207:'A :: bar':类模板的成员无法获取函数类型".
int Hello(int n)
{
return n;
}
template<class FunctionPtr>
struct A
{
A(FunctionPtr foo)
: bar(foo)
{}
FunctionPtr bar;
};
int main()
{
A<decltype(Hello)> a(Hello);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么?
BЈо*_*вић 10
关于这个错误,gcc有点友好:
error: field 'A<int(int)>::bar' invalidly declared function type
Run Code Online (Sandbox Code Playgroud)
最简单的解决方案是声明bar
为函数指针:
FunctionPtr *bar;
Run Code Online (Sandbox Code Playgroud)
在这种情况下,decltype(Hello)
评估结果int(int)
不是int(*)(int)
.
变量不能有函数类型.声明bar
是FunctionPtr
它是decltype(Hello)
将计算得到int (int)
,而不是一个函数指针类型.
当你定义的构造这是因为从C继承了一些不一致的混乱A
为取一个FunctionPtr
你想象你会得到同样的错误.但是,声明为具有数组或函数类型的函数参数(不幸的是,不方便)变为指针类型.因此,即使foo
声明具有函数类型,它实际上具有函数指针类型并且工作正常.
但是这个规则只适用于函数参数而不适用于其他变量,所以bar
实际上确实有一个函数类型,这是不合法的.