15

sto incontrando il seguente errore nel mio progetto:Ereditare-Costruttori + In-Class-inizializzazione di non predefinito tipo constructabe non riesce

 
error: use of deleted function ‘C::C(int)’ note: ‘C::C(int)’ is 
implicitly deleted because the default definition would be ill-formed: 
error: use of deleted function ‘M::M()’ 

Questo è il codice che sto usando:

struct M { 
    M(int){} 
    M() = delete; // Allowing this would work. 
}; 

struct B { 
    B(int) {} 
    B() = delete; 
}; 

struct C : public B { 
    using B::B; 
    M n = {5}; 

    // C(int i) : B(i) {} // Adding this would work 
}; 

C c{1}; 

Qualcuno sa perché sta succedendo questo?


Chiaramente la lingua è disposto a accodare più inizializzazione sull'estremità del costruttore ereditata (come è disposto a chiamare un costruttore di default). E chiaramente è disposto ad aggiungere implicitamente una chiamata al costruttore non predefinito (l'inizializzazione in classe) alla fine di un costruttore esplicitamente definito. Ma per qualche ragione che non capisco, non è disposto a fare entrambi allo stesso tempo.

Secondo this question, l'inoltro perfetto non è davvero perfetto e non dovrebbe essere utilizzato qui.

Nota: nel caso reale il/i costruttore/i di B è molto più complesso e soggetto a modifiche, quindi l'inoltro manuale di materiale non è realmente un'opzione praticabile.

+0

è il problema in Deleted 'B()'? Il compilatore non può scrivere il predefinito 'C()' perché ha bisogno del predefinito 'B()' per esistere ... – Arkadiy

+0

Compilare il programma con clang ++ 3.5 – dyp

+2

Per quanto ne so lo standard, questo programma è in realtà ben -formed. Il C (int) 'ctor implicitamente definito deve essere definito come' C (int p): B (static_cast (p)) {} ' – dyp

risposta

Problemi correlati