C++ c++;不能使用与私有基相同的类

C++ c++;不能使用与私有基相同的类,c++,inheritance,C++,Inheritance,我想知道为什么下面的示例没有编译: 我有一个ImageContainer类,它私下继承自Image(因此,它的用户不应该知道它继承自Image)。 此类还包含图像列表,并具有AddImage函数 class ImageContainer: private Image { public: ImageContainer (){}; void addImage (const Image &img){ //adds image to the container

我想知道为什么下面的示例没有编译: 我有一个ImageContainer类,它私下继承自Image(因此,它的用户不应该知道它继承自Image)。 此类还包含图像列表,并具有AddImage函数

class ImageContainer: private Image {
public:
    ImageContainer (){};

    void addImage (const Image &img){
        //adds image to the container
    };

    std::vector<Image> images;
};

class DerivedImageContainer: public ImageContainer {
public:

    void init () {
        addImage (Image (background, Position(960, 533), Align::MiddleCenter));
    }
};
我正在创建一个与ImageContainer的基类完全无关的映像 我甚至没有触及ImageContaner的内部内容,我只是调用了一个公共函数。为什么编译器会抱怨

这是否意味着,在派生函数中,我们不能在类层次结构的某个位置使用与私有继承类具有相同类型的成员


它不适用于g++4.8.2和g++7.5.0

在名称查找后执行访问检查。这里的问题是范围。在类的作用域内,非限定名称查找从类内部进入其基。因此它找到
Image
作为基的类型名。然后它必须检查这个基地的可访问性。因此出现了错误

补救办法是不要进行不合格的名称查找。用另一种方法指定
Image

addImage ( ::Image (background, Position(960, 533), Align::MiddleCenter) );

::Image
是命名空间范围内类型的完全限定名。因此,它跳过了类范围内的查找。

能否显示
图像
类声明?如果需要从
图像
继承,则需要
公共
继承。但是,您的代码看起来像
ImageContainer
使用
Image
类(作为向量中的成员)但实际上并不需要从中继承。@AdrianMole没有理由在继承时需要公共继承。与您的问题无关:从
Image
继承似乎是错误的,因为容器和图像没有is a关系,即图像容器不是图像。或者,在ImageContainer的公共范围中添加:
使用Image=Image
或者,忘记私有继承,或者完全删除
ImageContainer
的私有基。我的意思是,从什么时候开始,
ImageContainer
实际上是一个
图像
?这对我来说没有意义。如果有人对这个问题有其他答案,我建议他们把它贴在那边的答案框里。
addImage ( ::Image (background, Position(960, 533), Align::MiddleCenter) );