【发布时间】:2009-12-15 12:47:52
【问题描述】:
可能重复
Why can't I have a non-integral static const member in a class?
struct Example
{
static const int One = 1000; // Legal
static const short Two = 2000; // Illegal
static const float Three = 2000.0f; // Illegal
static const double Four = 3000.0; // Illegal
static const string Five = "Hello"; // Illegal
};
#2、#3、#4 和 #5 有什么不合法的原因吗?
我想我知道#5 的原因:编译器需要一个“真正的”字符串对象(因为它不是内置类型)并且不能盲目地将Five 替换为"Hello",就好像它是#define Five "Hello"。但如果是这种情况,编译器不能在 .obj 文件中留下提示并告诉链接器在某处自动创建 string Five 的一个实例吗?
对于#3 和#4,尤其是#2(哈哈!)...我真的看不出任何可能的原因!浮点数和双精度数是内置类型,就像 int 一样!而 short 只是一个(可能)更短的整数。
编辑:我使用 Visual Studio 2008 编译它。我认为在这种情况下所有编译器的行为都相同,但显然 g++ 编译得很好(#5除外)。 VS 为该 sn-ps 给出的错误是:
错误 C2864:“Example::Two”:只能在类中初始化静态 const 整数数据成员 错误 C2864:'Example::Three':只能在类中初始化静态 const 整数数据成员 错误 C2864:'Example::Four':只能在类中初始化静态 const 整数数据成员 错误 C2864:'Example::Five':只能在类中初始化静态 const 整数数据成员【问题讨论】:
-
你在不同的编译器上试过了吗?如果有,是哪个?错误信息在哪里?
-
你用的是什么编译器?用 G++ 编译对我来说很好(字符串除外)。
-
VS2008(编辑主要问题)
-
@schnaader:你应该用过 -pedantic。
标签: c++ static initialization class-members