函数类型可以是类模板参数吗?

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).

  • 那么兼容性解决方案是什么?如果不是传递&Hello,他传递了一个重载了operator()的结构,这样可以正常工作.如何编写可以接受函数对象或函数指针的通用代码? (5认同)

bam*_*s53 5

变量不能有函数类型.声明barFunctionPtr它是decltype(Hello)将计算得到int (int),而不是一个函数指针类型.

当你定义的构造这是因为从C继承了一些不一致的混乱A为取一个FunctionPtr你想象你会得到同样的错误.但是,声明为具有数组或函数类型的函数参数(不幸的是,不方便)变为指针类型.因此,即使foo声明具有函数类型,它实际上具有函数指针类型并且工作正常.

但是这个规则只适用于函数参数而不适用于其他变量,所以bar实际上确实有一个函数类型,这是不合法的.