以下代码虽然看起来能够编译,但被 GCC/Clang/MSVC 拒绝。
class B {
};
class C : private B {
friend B& to_B(C& c) {
return static_cast<B&>(c);
}
};
class D : private C {
friend C& to_C(D& d) {
return static_cast<C&>(d);
}
friend B& to_B(D& d) {
return to_B(to_C(d));
}
};
为什么编译失败?
GCC 错误消息:
<source>:12:12: error: 'class B B::B' is private within this context
12 | friend B& to_B(D& d) {
| ^
<source>:3:7: note: declared private here
3 | class C : private B {
| ^
最佳答案
我找不到章节和诗句来支持它,但是 C
的私有(private)继承使得 B
如果从 D
的定义中查找,则完全私有(private).
(本质上, B
首先在继承链中查找,并且由于名称查找在第一个匹配处停止,因此它是 C
私有(private)的。从不考虑全局定义。)
您可以通过修改具有显式作用域的名称查找过程来使其编译:
friend ::B& to_B(D& d)
关于c++ - 友元函数出现奇怪的编译器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71249100/