据我理解,如果使用class
限定符,friend
声明也可以作为类的前向声明,例如:
class A
{
friend class B;
B* b;
};
class B {};
int main() {}
然而,g++(4.6.3和4.7.0)给出了以下错误(g++-4.7应该支持扩展友元声明),如果没有前向声明,则会出现这种情况:
为了确认我的期望,即main.cpp:6:2: error: ‘B’ does not name a type
friend class B;
应该作为前向声明,我找到了这个答案和这个答案,但是两者都没有得出结论(或者我至少不能从中得出结论),因此我尝试查阅c++11标准,并找到了这个例子:class X2 {
friend Ct; // OK: class C is a friend
friend D; // error: no type-name D in scope
friend class D; // OK: elaborated-type-specifier declares new class
}
根据我对第三个声明的阅读,我的friend class B
应该是一个用于声明新类的详细类型说明符。
我刚开始理解官方标准措辞,所以可能有些地方没看懂。请问我哪里有误解?
::B
:http://ideone.com/bEgZrq。注意“最内层的封闭*非类*作用域”。 - aschepler