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.
è il problema in Deleted 'B()'? Il compilatore non può scrivere il predefinito 'C()' perché ha bisogno del predefinito 'B()' per esistere ... – Arkadiy
Compilare il programma con clang ++ 3.5 – dyp
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