当前位置: 首页 > 知识库问答 >
问题:

访问friend类私有成员的friend函数

卫增
2023-03-14
class A {
public:    
    // forward declaration
    class Inner2;

private:
    class Inner1 {
        char foo;
        friend class Inner2;
    };
public:
    class Inner2 {
        Inner1 i;
    public:
        bool operator==(Inner2 other) {
            return i.foo == other.i.foo; // OK by GCC, Clang and MSVC++
        }
        friend bool operator!=(Inner2 a, Inner2 b) {
            return a.i.foo != b.i.foo; // Clang accepts, GCC and MSVC++ reject
        }
    };
};

注意:如果friend函数只是在类中声明并在外部实现,那么Clang和GCC都会拒绝该代码。

共有1个答案

梁丘经艺
2023-03-14

这似乎是clang中的一个已知缺陷,错误id为11515,早在2011年就已经报告过了,但显然仍未修复。

一个更简单的示例编译,并且不应该编译(从上面的bug报告中):

class A {
  int n;
  friend struct B;
};

struct B {
  friend int get(A &a) {
    return a.n; // clang accepts, and should reject
  }
};

https://godbolt.org/z/r78pazoqj

 类似资料:
  • 问题内容: 是在类级别还是在对象级别的私有成员访问权限。如果是在对象级别,则以下代码不应编译 请说明在sub的messWithI()方法中访问obj的成员i是否有效 问题答案: 正如DevSolar所说的,它处于(顶级)类级别。 从Java语言规范的6.6节开始: 否则,如果将成员或构造函数声明为私有,则仅当访问发生在包含成员或构造函数的声明的顶级类(第7.6节)的主体内时,才允许访问。 请注意,

  • Google Friend Connect能使用户使用已有的OpenID帐号,如Google帐号、AIM帐号或Yahoo!帐号登录您的网站。这方便了用户:他们不再需要重新填 写相同的注册表格,而是将他们已有的用户信息,包括头像和个人介绍自动化地导入过来。基于这种简单的用户资料整合方式,在安装了Google Friend Connect插件的平台上,用户黏度和交互性将得到提高。 Google Fri

  • 在下面的代码中,是一个模板类,取决于非类型参数。为和定义了friend。还依赖于另一个bool模板参数。 在Coliru上看现场直播。 现在,我想给出的模板参数的默认值,例如,以便以下语句 相当于 如果我在 同样,它不编译给出错误 main.cpp:27:15:错误:重新声明friend'template std::ostream&operator<<(std::ostream&,const a&

  • Hello Friend DEMO - https://hugo-hello-friend.now.sh/ Hello Friend DEMO - https://hugo-hello-friend.now.sh/ Features Built-in shortcodes Code highlighting Improved RSS Feed How to start How to run you

  • 我有一个全局函数是这样的: 然后在另一个类中,我要将这个函数声明为的朋友。所以我做了: 现在,当我调用时,它无法编译,错误是foo无法访问的私有构造函数。我无法理解该错误,如何正确声明为的朋友? 提前道谢。

  • 问题内容: 有什么方法可以使“私有”变量(在构造函数中定义的变量)可供原型定义的方法使用? 这有效: 但这不是: 我习惯于在构造函数中定义方法,但出于以下两个原因而逐渐远离它。 问题答案: 不,没有办法。这基本上是相反的范围。 在构造函数内部定义的方法可以访问私有变量,因为所有函数都可以访问定义它们的作用域。 在原型上定义的方法未在构造函数的范围内定义,并且将无法访问构造函数的局部变量。 您仍然可