采取这些类定义:
班级定义1:
struct A
{
struct B* m_b;
};
Run Code Online (Sandbox Code Playgroud)
班级定义2:
struct A
{
struct B;
B* m_b;
};
Run Code Online (Sandbox Code Playgroud)
类定义都应该声明B为嵌套类.至少,通过阅读C++ 11标准草案中的以下内容,我的想法是:
9.1/2类声明将类名引入声明它的作用域中,并在封闭作用域中隐藏该名称的任何类,变量,函数或其他声明(3.3).如果一个类名称被在一个范围内声明,其中的变量,函数,或具有相同名称的枚举还声明,那么当两个声明是在范围内,类可以被称为仅使用阐述型说明符 `
但是,g ++ 4.8.2对它们的处理方式不同.在第一个定义中,它将其视为B同类的类A.
以下程序成功构建:
struct A
{
struct B* m_b;
};
void myfun(const B& b )
{
}
int main()
{
A a;
myfun(*a.m_b);
}
Run Code Online (Sandbox Code Playgroud)
而以下程序没有:
struct A
{
struct B;
B* m_b;
};
void myfun(const B& b )
{
}
int main()
{
A a;
myfun(*a.m_b);
}
Run Code Online (Sandbox Code Playgroud)
我理解为什么第二个程序没有编译,但我不明白为什么第一个程序是成功构建的.
我在标准的解释中遗漏了什么吗?
编译第一个程序时g …