gpt4 book ai didi

c++ - friend 类声明和使用指令

转载 作者:IT老高 更新时间:2023-10-28 23:01:19 25 4
gpt4 key购买 nike

以下示例格式正确吗?

namespace N {
class A;
}
using namespace N;

class B {
int i;
friend class A;
};

namespace N {
class A {
B m;
int get() { return m.i; }
};
}

此示例使用 Clang 3.5 成功编译,但使用 g++ 4.8.1 编译失败,原因如下:

main.cpp: In member function ‘int N::A::get()’:
main.cpp:7:9: error: ‘int B::i’ is private
int i;
^
main.cpp:14:30: error: within this context
int get() { return m.i; }
^

C++11 标准§7.3.1.2 p3 说,

If the name in a friend declaration is neither qualified nor a template-id and the declaration is a function or an elaborated-type-specifier, the lookup to determine whether the entity has been previously declared shall not consider any scopes outside the innermost enclosing namespace.

例如,class A 不是innermost enclosure namespace(即全局命名空间)的成员,但 class A 是通过 using 指令引入的进入全局命名空间。

最佳答案

要使 N::A 成为 B friend ,您可以使用

friend A;

而不是

friend class A;

当使用详细的类型说明符,即 class A,并且它是这种特定形式时,它会引入一个类名(参见 3.4.4 [basic.lookup.elab] 第 2 段) .

关于c++ - friend 类声明和使用指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21029511/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com