当内部类是类和结构时,无法访问的基础

时间:2014-08-06 17:30:40

标签: c++

使用g ++ 4.4.6,以下内容无法编译:

#include <iostream>

struct Base {};

std::ostream& operator<<(std::ostream& os, const Base&) { return os << "Hi\n"; }

template <class T>
class Container
{
   class Derived : Base {};

   template <class U>
   friend std::ostream& operator<<(std::ostream& os, const typename Container<U>::Derived&);
};

template <typename U>
std::ostream&
operator<<(std::ostream& os, const typename Container<U>::Derived& der)
{
   return os << static_cast<const Base&>(der);
}

int main()
{
   Container<int>::Derived d;
   std::cout << d;
   return 0;
}

结果:

/tmp $ g++ test.c
test.c: In function ‘int main()’:
test.c:26: error: ‘Base’ is an inaccessible base of ‘Container<int>::Derived’
/tmp $ g++ --version

但是,如果我只是改变

class Derived : Base {}

struct Derived : Base {}

它编译没有问题。这里发生了什么?

1 个答案:

答案 0 :(得分:1)

为了得到答案,我将直接引用C ++标准,第11.2节,[class.access.base]

  

如果没有基类的访问说明符,则在使用类 - 键结构定义派生类时假定为public,并且在使用类 - 键类定义类时假定为private

所以在你的情况下,第一个拥有Base的私有继承,第二个拥有公共。