2017-01-12 3 views
3

Мне было сложно сформулировать правильный заголовок.Конструктор пытается вызвать конструктор копирования, виртуальное наследование

struct Base 
{ 
    Base(int) {} 
    virtual ~Base()=default; 
}; 

struct Derived: virtual public Base 
{ 
    Derived(float, int): Base{1} {} 
    Derived(Derived const&)=delete; 
    ~Derived()=default; 
}; 

struct Comp: private Derived 
{ 
    Comp(): Base{1}, Derived{1.0f, 1} {} 
}; 

Это дает ошибку при компиляции:

x.cc: In constructor ‘Comp::Comp()’: 
x.cc:16:34: error: use of deleted function ‘Derived::Derived(const Derived&)’ 
    Comp(): Base{1}, Derived{1.0f, 1} {} 
              ^
x.cc:10:2: note: declared here 
    Derived(Derived const&)=delete; 
    ^~~~~~~ 

Почему конструктор копирования запрашиваться здесь? Проблема исчезает, когда я избавляюсь от виртуального наследования (и, соответственно, вызов Base(int) в списке инициализаторов Comp).

Это на gcc version 6.2.1 20161124 (Debian 6.2.1-5).

+0

@juanchopanza Извините, было немного непоследовательно, потому что я упростил пример дальше. – TFM

+1

Опубликовать реальный [mcve]. Включая компилятор и версию, если код действительно не скомпилирован. – juanchopanza

+0

Что вы ожидаете от 'Base {1}' в конструкторе 'Comp', учитывая, что' Comp' не является производным от 'Base'? –

ответ

Смежные вопросы