c++ - 友元函数出现奇怪的编译器错误

标签 c++

以下代码虽然看起来能够编译,但被 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/

相关文章:

c++ - 将任何类型的对象的函数传递给 C++ 中的另一个对象

c++ - 常量函数由非常量对象调用。为什么?

c++ - 使用类型的参数包和相应值的输入数组构造类型

c++ - 在类 C++ 中存储指向 istream 和 ostream 的指针

c++ - C++ 问题 : Error C2143, 错误 C2059,错误 C2238

c++ - 使用这种粉刺替代品会牺牲什么?

c++ - 将数字转换为格式化字符串并再次解析格式化字符串

C++ - 将类型映射到枚举

c++ - 使用线程时的内存分配问题

c++ - 在 OpenCV 中绘制矩形