C++ C++;循环依赖项-命名空间与结构

C++ C++;循环依赖项-命名空间与结构,c++,namespaces,C++,Namespaces,请教育我。为什么要编译: struct compiles { struct A; struct B { B(const A &a) : member(a.member) { } int member; }; struct A { A(const B &b) : member(b.member) { } int member; }; }; 但这并不是: name

请教育我。为什么要编译:

struct compiles
{
    struct A;
    struct B
    {
        B(const A &a) : member(a.member) { }
        int member;
    };
    struct A
    {
        A(const B &b) : member(b.member) { }
        int member;
    };
};
但这并不是:

namespace doesnt
{
    struct A;
    struct B
    {
        B(const A &a) : member(a.member) { }
        int member;
    };
    struct A
    {
        A(const B &b) : member(b.member) { }
        int member;
    };
}

(在MSVC 9.0中)

一次处理
/
结构
/
联合定义的主体,允许引用以后定义的类的成员。
命名空间
是从上到下处理的,而
struct A
的正向声明不允许您在没有定义的情况下使用其成员。尝试将
B
的构造函数的定义移出类,这样您就可以将它放在
A

[也使用g++4.2测试]的定义之后。第一个构造函数是编译的,因为编译器在实际编译嵌套结构之前完全拾取了结构中定义的所有类型(考虑使用类中稍后出现的私有属性的公共内联方法)在命名空间内,编译器只需上下操作,没有特殊规则。C++中的

< P>,类范围是特殊的。任何扩展到或超过类定义结束的声明都会自动扩展到其成员定义(3.3.6[Basic,Simult.Cype ])定义的区域。 这意味着在第一种情况下,
struct A
的第一个声明和
struct A
的完整定义都可以在
B
的主体及其构造函数中看到


这不适用于命名空间范围,因此在第二种情况下,
B
的构造函数中的
a.member
是一个错误,因为
struct a
的定义尚不可见。

如果将构造函数的实现移动到.cpp文件中,它们都将编译。

编译器错误是什么你得到了什么?