【问题标题】:C++ compiler error involving private inheritance涉及私有继承的 C++ 编译器错误
【发布时间】:2012-03-02 15:34:48
【问题描述】:

有人可以向我解释以下编译器错误吗:

struct B
{
};

template <typename T>
struct A : private T
{
};

struct C : public A<B>            
{                                                                             
    C(A<B>);   // ERROR HERE
};

指示行的错误是:

test.cpp:2:1: error: 'struct B B::B' is inaccessible
test.cpp:12:7: error: within this context

究竟什么是不可访问的,为什么?

【问题讨论】:

  • 与问题无关,这里的C(A)是什么意思?
  • @fizzbuzz:构造函数按值获取A&lt;B&gt;
  • @Xeo,哦,是的,A 只是一种类型。

标签: c++ templates inheritance compiler-errors private-inheritance


【解决方案1】:

当你做A&lt;B&gt;时,你正在让AprivateB继承,这意味着B::Bprivate,所以你不能构造C

【讨论】:

  • 错了,A&lt;B&gt; 必须构造 B 基础子对象,并且可以在那里访问。
  • 什么是B::B? B 隐式声明的默认构造函数?
  • @HighCommander B::B 是在A&lt;B&gt; 中创建private 的隐式声明的默认构造函数。
【解决方案2】:

试试A&lt; ::B&gt;A&lt;struct B&gt;

C 内部,对B 的非限定引用会拾取所谓的injected-class-name,它是通过基类A 引入的。由于A 是从B 私有继承的,injected-class-name 也随之而来,也是私有的,因此C 无法访问。

又是一天,另一种语言怪癖......

【讨论】:

  • 好问题。我的回答起初看起来像“试试A&lt; ::B&gt;。为什么?打败我……”。现在,错误消息指的是构造函数B::B,所以这是唯一的选择。不,我不知道为什么它会尝试在模板参数列表中选择成员函数...
  • 那么,这个解析怪癖是故意的,是编译器错误(不太可能,因为 GCC 和 Comeau 都给出了这个错误),还是标准中的解析规范不足/错误?
  • 三个 MSVC、GCC 和 Clang 都出现了这个错误,所以它一定是规范中的东西。我刚刚在 llvm IRC 频道上问过,会反馈。
  • 我还开了一个follow-up question
【解决方案3】:

问题是 struct B 的名称屏蔽。 看看吧:

struct B{};

struct X{};

template <class T>
struct A : private T
{};

struct C : public A<B>
{
    C(){
          A<X> t1;     // WORKS
 //       A<B> t2;     // WRONG
          A< ::B> t3;  // WORKS
    }   
};

int main () {
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多