类中的Const静态函数指针〜如何初始化它?

时间:2013-05-09 10:00:04

标签: c++

我有一小段代码:

int add(int x, int y)
{
    return x + y;
}

class A
{
public:
    const static int (*FP)(int, int) = &add;
};

int main()
{
    int x = 3;
    int y = 2;
    int z = A::FP(x, y);
    return 0;
}

在VS2012下,会产生以下错误: 错误C2864:'A :: FP':只能在类中初始化静态const积分数据成员。

我有没有看到的东西?或者由于某种原因显然不可能?

基督教

3 个答案:

答案 0 :(得分:3)

在类定义之外初始化,使用typedef使const成为可能:

typedef int (*func_t)(int, int);

class A
{
public:
    const static func_t FP;
};

const func_t A::FP = &add;

没有typedef声明:

const static int (*FP)(int, int) = &add;

是名为static的{​​{1}}函数指针,返回类型为FP,而不是const int函数指针。使用警告级别const进行编译时,会发出以下诊断信息:

  

警告C4180:应用于函数类型的限定符没有意义;忽略

由于声明的排序/W4而不是const static int,因此并未立即显现。

答案 1 :(得分:1)

在C ++ 03中。在课堂上初始化non-intgeralenum data-types是不允许的。

class A
{
public:
    typedef int (*FP_ptr)(int, int);
    const static FP_ptr FP;
};

const A::FP_ptr 
A::FP = &add;

C ++ 11

class A
{
public:
    constexpr static int (*FP)(int, int) = &add;
};

答案 2 :(得分:0)

非常感谢,伙计们。我最近遇到了同样的问题。只想用" const"添加答案。在没有声明新类型的正确位置:

class A
{
public:
    static int (* const FP)(int, int);
};

int (* const A::FP)(int, int) = &add;

没关系,将最后一行更改为(我不确定它是否完全相同,但它有效):

int (* const A::FP)(int, int) = add;

另一种方式(其他人如何解决类似问题)将是:

class A
{
public:
    static int FP(int, int);
};

int A::FP(int x, int y)
{
    return add( &x, &y );
}