3

我有一小段代码:

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' : only static const integer data members can be initialized in a class.

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

基督教

4

3 回答 3

3

在类定义之外初始化,使用 atypedef使之成为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命名的函数指针,而不是函数指针。当使用警告级别编译时,会发出以下诊断信息:FPconst intconst/W4

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

由于声明的顺序,这不是立即显而易见的,const static int而不是static const int.

于 2013-05-09T10:03:58.003 回答
1

在 C++03 中。在类中初始化non-intgeralorenum 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;
};
于 2013-05-09T10:06:56.353 回答
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 );
}
于 2014-07-08T13:25:24.877 回答