int main() {
    B bb;                           //does not compile (neither does class B bb;)
    C cc;                           //does not compile

    struct t tt;                    //compiles

    class B {};                     //HERE is the class B defination
    struct s { struct t * pt; };    //compiles
    struct t { struct s * ps; };

    return 0;
}

class C {};

我刚刚修改了给定 here 的示例。

为什么结构前向声明有效,而类前向声明​​无效?

它与命名空间 - tag namespacetypedef namespace 有关系吗?我知道没有 typedef 的结构定义转到标记命名空间。

结构只是具有所有公共(public)成员的类。所以,我希望他们的行为类似。

最佳答案

前向声明适用于类,但除您期望的之外。
首先,您必须在 class B; 例程的代码之前编写 main
然后你必须写 B * bb; 而不是 B bb; 。只有在类定义之后才能构造类型 B 的对象。

这种行为的原因如下:编译器不知道它必须在堆栈上为类 B 的实例分配多少字节,因为此信息取决于类的定义(您当时没有给出) )。但是,可以在 B 的前向声明之后构造指向类 B 实例的指针,因为指针的大小是先前已知的(并且通常对于所有指针类型都相同)。

关于c++ - 为什么前向声明不适用于类?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2650644/

10-11 18:44