使用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 {}
它编译没有问题。这里发生了什么?
答案 0 :(得分:1)
为了得到答案,我将直接引用C ++标准,第11.2节,[class.access.base]
如果没有基类的访问说明符,则在使用类 - 键结构定义派生类时假定为public,并且在使用类 - 键类定义类时假定为private
所以在你的情况下,第一个拥有Base
的私有继承,第二个拥有公共。