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都会拒绝该代码。
这似乎是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无法访问的私有构造函数。我无法理解该错误,如何正确声明为的朋友? 提前道谢。
问题内容: 有什么方法可以使“私有”变量(在构造函数中定义的变量)可供原型定义的方法使用? 这有效: 但这不是: 我习惯于在构造函数中定义方法,但出于以下两个原因而逐渐远离它。 问题答案: 不,没有办法。这基本上是相反的范围。 在构造函数内部定义的方法可以访问私有变量,因为所有函数都可以访问定义它们的作用域。 在原型上定义的方法未在构造函数的范围内定义,并且将无法访问构造函数的局部变量。 您仍然可