gpt4 book ai didi

c++ - 通过 friend 访问类中的 protected 类型 - gcc 允许,clang 不允许

转载 作者:太空狗 更新时间:2023-10-29 21:10:55 25 4
gpt4 key购买 nike

哪个编译器是正确的 - 或者这是标准中的缺陷?

GCC 编译以下代码,但 clang 报错:

<source>:20:7: error: 'Impl' is a protected member of 'A'

代码:

template<typename T>
struct WrapperBuilder;

template <typename T>
struct LetMeIn : public T {
friend struct WrapperBuilder<T>;
};

class A {
protected:
struct Impl;
};

// without this line, gcc complains too (but I think I understand why)
extern template struct LetMeIn<A>;

template<>
struct WrapperBuilder<A> {

A::Impl * i; // Clang doesn't like this line
};

谢谢。

https://godbolt.org/z/Qa7zZ6

此外,有人知道不涉及更改 A 的 clang 解决方法吗?

最佳答案

clang 是对的。请注意 gcc 有 many bugs在模板中进行访问检查。

ImplA 的 protected 成员, WrapperBuilder<A>两者都不是来自 A也不是 friendA .

LetMeIn没有以相关的方式给予友元。显式模板实例化使得 WrapperBuilder<A>一个friendLetMeIn<A> , 但友元不是传递性的——这不会使它成为 friendA .


LetMinIn<A>::Impl有效……但非常间接。如果你愿意,你可以更直接地做到这一点:

struct LetMeIn : A {
using Impl = A::Impl;
};

现在它是公开的。

关于c++ - 通过 friend 访问类中的 protected 类型 - gcc 允许,clang 不允许,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52191903/

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