访问友元类模板的base子句中的私有定义

时间:2017-10-18 21:53:50

标签: c++ templates

在C ++中合法制作类模板B的基类规范是否依赖于类A的私有定义,它是类模板B的朋友?示例代码:

struct Empty {};

template <typename T>
struct B;

struct A
{
    friend struct B<A>;

private:
    using Base = Empty;
};

template <typename T>
struct B : T::Base
{
};

int main()
{
    B<A> test;
    return 0;
}

Godbolt链接:https://godbolt.org/g/HFKaTQ

代码可以使用Clang trunk(和旧版本)和MSVC 19(VS 2017)编译,但无法使用GCC trunk(和旧版本)进行编译:

test.cpp: In instantiation of 'class B<A>':
test.cpp:21:7:   required from here
test.cpp:15:8: error: 'using Base = class Empty' is private within this context
 struct B : T::Base
        ^
test.cpp:11:20: note: declared private here
  using Base = Empty;
                    ^

哪个编译器错了?

编辑:顺便说一句,如果将B转换为常规类(删除模板参数),代码将在GCC中编译。所以,我猜它也应该在类模板的情况下工作。另外cppreference说:&#34;朋友本身也可以从这个类的私有和受保护成员继承。 (自C ++ 11起)&#34;

1 个答案:

答案 0 :(得分:0)

显然这是GCC中的一个错误。提交为Bug 82613