Получение ошибки не может наследовать конструкторы от косвенной базы в компиляторе c ++ 17 - PullRequest
1 голос
/ 28 апреля 2020
#include <iostream> 
#include <chrono>    

class A{
    public:
        A(){} // default constr

};

class B:public A{
    public:
    using A::A;
    protected:

};

class C:public B{
    public:
        using A::A; //scope resolution 

        int f1(A a);// dummy function

};

int main () 
{ 
    return 0; 
} 

// Вышеуказанная программа работает нормально с C ++ и C ++ 14, но выдает ошибку с C ++ 17 // почему и как ее можно решить?

1 Ответ

2 голосов
/ 28 апреля 2020

Да, конструкторы могут быть унаследованы только от прямого базового класса. [namespace.udecl] / 3

Если , использующий-декларатор , называет конструктор, его спецификатор вложенного имени должен называть прямой базовый класс определяемого класса.

Вы можете наследовать конструкторы от B в классе C; конструкторы A были унаследованы в B, тогда они будут наследоваться и в C.

class C : public B {
    public:
        using B::B;
        //    ^^^^
};
...