朋友申报不向前申报
friend declaration not forward declaring
本文关键字:朋友 更新时间:2023-10-16
我的理解是,如果使用了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 ' 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
应该是一个详细的类型说明符,声明一个新的类。
我刚刚开始理解官方标准措辞,所以我一定错过了什么。我误解了什么?
您的friend class B;
声明确实用作前向声明,但是在提供匹配的声明之前,名称查找无法找到此类声明。
[class.friend]/11 :
如果友元声明出现在局部类(9.8)中,并且指定的名称是非限定名,则查找先前的声明,而不考虑最内层封闭非类作用域之外的作用域。对于友元函数声明,如果没有事先声明,则程序是病态的。对于友类声明,如果没有预先声明,则指定的类属于最内层的封闭类非类作用域,但如果随后引用它,则在最内层的非类作用域中提供匹配声明之前,不会通过名称查找找到它的名称。
看11.3第11段:
对于友类声明,如果没有先前的声明,则指定的类属于最内层的封闭非类作用域,但如果它随后被引用,则在最内层的封闭非类作用域中提供匹配的声明之前,通过名称查找无法找到它的名称。
的例子:
class X;
void a();
void f() {
class Y;
extern void b();
class A {
friend class X; // OK, but X is a local class, not ::X
friend class Y; // OK
friend class Z; // OK, introduces local class Z.
friend void a(); // error, ::a is not considered
friend void b(); // OK
friend void c(); // error
};
X *px; // OK, but ::X is found
Z *pz; // error, no Z is found
}
相关文章:
- 一位朋友将模板函数缩写为clang和gcc
- 班级的朋友是不可接近的
- 与朋友声明相反
- 为什么即使我声明了朋友类,我也会收到错误"无法访问类中声明的私人成员"
- 类似虚拟的朋友功能?
- 为什么C++需要公共继承,忽略朋友声明,才能使动态向下工作?
- 在朋友类中使用模板
- 访问私人成员而不使用朋友类
- 类和朋友在它们之间起作用
- "朋友"成员函数和 GCC 与 Clang
- 朋友声明的复杂范围界定规则有什么意义?
- C++:让函数成为多个类的朋友?
- 有没有办法C++将给定类的功能限制为仅另一个类(不使用继承,朋友)?
- 朋友,前瞻宣言,C++
- 在VS 2017中,朋友通过具有私有析构函数的结构的unique_ptr向量进行迭代失败
- 限制多模板参数朋友函数可访问的类实例的范围
- 朋友定义函数的名称空间是什么
- 朋友函数随机行为
- 从安卓NDK15切换到17使得malloc和朋友找不到
- 在课堂上创建了一个朋友,给出"无输入文件"错误