c не может использовать родительский тип в качестве параметра в конструкторе

#c #g

#c #g

Вопрос:

При попытке использовать тип предка в качестве параметра в конструкторе g , похоже, ошибочно принимает тип за несуществующий конструктор по умолчанию. Что здесь происходит, и есть ли исправление?

Минимальный пример:

 class Outer
{
};

class Middle : Outer
{
    public:
    Middle(int i):i(i){}
    protected:
    int i;
};

class Inner : Middle 
{
    public:
    Inner(int i, Outer *o):Middle(i){}

};
  

вывод g :

 example.h:16:18: error: ‘class Outer Outer::Outer’ is inaccessible within this context
     Inner(int i, Outer *o):Middle(i){}
                  ^~~~~
example.h:2:1: note: declared here
 {
 ^
  

Комментарии:

1. Почему вы используете частное наследование?

Ответ №1:

Вам нужно полностью указать квалификатор Outer , иначе это частная база, которая недоступна:

 class Inner : Middle 
{
    public:
    Inner(int i, ::Outer *o):Middle(i){}

};
  

Или же используйте цепочку наследования protected / public :

 class Middle : public Outer
{
public:
    Middle(int i):i(i){}
protected:
    int i;
};

class Inner : public Middle 
{
public:
    Inner(int i, Outer *o):Middle(i){}
};