2011-11-09 35 views
16

正在声明一个类型的静态字段,该类型在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年的那个)。

回答

13

是的,你在做什么是特别允许的(§9.4.2/ 2):“静态数据成员在其类定义中的声明不是一个定义,并且可能是一个不完整的类型,而不是cv-合格的无效“。

2

我不能引用标准,但我可以给你“像编译器一样思考”的建议。

在声明something时,编译器需要知道什么类型?如果它是一个普通成员,它需要知道大小,以便它可以将其包含在类定义中,但是对静态成员来说这不是真的,因为它们的存储不是类的一部分。它不需要知道如何构建它,因为它不会被构建为类构造的一部分。编译器在声明时不需要知道有关该静态类的任何内容,因此前向声明可以正常工作。

+1

是。这就是为什么我说“我没有看到它被拒绝的理由”。我知道你写的东西,我只是不确定标准是否由于某种原因不允许这样的代码(它是C++,你永远无法确定),所以我想直接引用它。此外,我不得不在这里问我的第一个问题;) – Fanael

相关问题