【发布时间】:2015-04-05 11:42:29
【问题描述】:
这就是我现在拥有的:
class CColorf
{
public:
CColorf();
CColorf(float r, float g, float b, float a = 1.0f);
public:
float r, g, b, a;
// predefined colors
// rgb(0.0, 0.0, 1.0)
static const CColorf blue;
};
它适用于 ccolorf.cpp 中定义的blue,如下所示:
CColorf const CColorf::blue = CColorf(0.0f, 0.0f, 1.0f);
这就是我想做的:
class CColorf
{
...
// predefined colors
// rgb(0.0, 0.0, 1.0)
static const CColorf blue = CColorf(0.0f, 0.0f, 1.0f);
};
但是会产生编译错误:
具有类内初始化程序的静态数据成员必须具有非易失性 const 整数类型
有没有办法避免这里需要单独声明和定义?
【问题讨论】:
-
声明它
constexpr。CColof是文字类型,因此应该可以工作。 -
@Columbo:
constexpr不应该与表达式(或函数)一起使用,而不是声明吗? -
...不知道你的意思,但你听起来很困惑。
constexpr是一个 decl-specifier(声明说明符),因此只能在声明中使用。 -
@Columbo:我很困惑。以前从未使用过
constexpr,几乎不知道它是什么意思。立即阅读。 -
@Columbo:不,问题是试图初始化一个不完整的类型,并试图在类中初始化一个非文字类型的静态成员。无法绕过这些限制(可以通过删除构造函数(使其成为聚合)或将其声明为
constexpr来使此类成为文字。但在其定义中仍然是不完整的。)