在C ++中类定义合法时,声明一个类型的静态字段是不完整的吗?例如:
foo.h中:
class Foo
{
public:
// ...
private:
class Bar;
static Bar something;
};
Foo.cpp中:
class Foo::Bar
{
// ...
};
Foo::Bar Foo::something;
// some more code
编译器似乎接受了它,我没有看到它应该被拒绝的原因,但标准对这种情况有何看法?我非常感谢有人直接引用标准,最好来自“旧”标准(2003年的标准)。
答案 0 :(得分:14)
是的,你正在做的是特别允许的(§9.4.2/ 2):“在类定义中声明静态数据成员不是定义,除了cv-qualified之外可能是不完整的类型作废“。
答案 1 :(得分:3)
我不能引用标准,但我可以给你“像编译器一样思考”的建议。
当你宣布something
时,编译器需要知道什么类型?如果它是一个普通的成员,它需要知道它的大小,以便它可以将它包含在类定义中,但静态成员不是这样,因为它们的存储不是类的一部分。它不需要知道如何构造它,因为它不会被构造为类构造的一部分。在声明它时,编译器确实没有任何关于该静态类的知识,因此前向声明可以正常工作。