2012-07-09 10 views
7

Non sono sicuro di quante informazioni sono necessarie per rispondere a questo, quindi dimmi se sono necessarie ulteriori informazioni.Classe C++ non è di per sé

Im modificare un grande codice che ho scritto quando ho improvvisamente riscontrato questo messaggio: error: type 'integer' is not a direct base of 'integer'. so che è un problema di ereditarietà, ma non sto ereditando altre classi.

Il codice che causa il problema è

integer(const std::string & val, uint16_t base): integer(val.begin(), val.end(), base) {} 

e

integer(iterator start, iterator end, uint16_t base) 

è stato definito.

Cosa devo fare per risolvere questo problema?

EDIT: im compilazione con -std = C++ 0x, che secondo le risposte, dovrei essere in grado di compilare, a meno che il mio compilatore è vecchio: gcc 4.6.2 penso

+2

Risposta di aggiornamento, disponibile in gcc 4.7 in poi. – hmjd

risposta

19

Sembra che si sta cercando di chiamare direttamente un altro costruttore. Non si può fare che in C++ 03, ma si can do exactly that in C++11:

class SomeType { 
    int number; 

public: 
    SomeType(int new_number) : number(new_number) {} 
    SomeType() : SomeType(42) {} 
}; 

avrete bisogno di g ++ 4.7 o più recente per far funzionare tutto questo, 4.6 non supporta ancora questa funzione, anche con -std = C++ 0x, che ho provato con entrambe le versioni sul mio sistema.

+0

nella compilazione con -std = C++ 0x – calccrypto

+3

@calccrypto GCC 4.6 non supporta questo. 4.7 penso. – Flexo

3

Non è possibile chiamare un costruttore della stessa classe nella lista di inizializzazione di un costruttore diverso (in C++ 03). Ma è possibile inizializzare i membri di conseguenza:

integer(const std::string & val, uint16_t base): _start(val.begin()) 
               _end(val.end()) 
               _base(base) 
{} 
4

Non è consentito invocare altri costruttori dello stesso class così (ci sono costruttori delegante C++ 11). È necessario inizializzare i membri della classe (come probabilmente è stato fatto nell'altro costruttore).

EDIT:

Secondo C++0x/C++11 Support in GCC , costruttori delega sono stati attuati in GCC v4.7

Problemi correlati