我有一小段代码:
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积分数据成员。
我有没有看到的东西?或者由于某种原因显然不可能?
基督教
答案 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-intgeral
或enum
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 );
}