istanziato da qui l'errore
-
13-09-2019 - |
Domanda
il mio compilatore mi sta torturando con questo errore esemplificazione, che ho completamente non capisco.
Ho modello di classe listItem:
template <class T>
class tListItem{
public:
tListItem(T t){tData=t; next=0;}
tListItem *next;
T data(){return tData;}
private:
T tData;
};
se provo per inizializzare un oggetto di esso con tipo di dati di base come per esempio:
sPacket zomg("whaever",1);
tListItem<sPacket> z(zomg);
il mio compilatore genera sempre questo errore .. l'errore è neanche gettato con i tipi primitivi.
uscita dal compilatore è:
../linkedList/tListItem.h: In constructor ‘tListItem<T>::tListItem(T) [with T = sPacket]’:
recvBufTest.cpp:15: instantiated from here
../linkedList/tListItem.h:4: error: no matching function for call to ‘sPacket::sPacket()’
../packetz/sPacket.h:2: note: candidates are: sPacket::sPacket(const char*, int)
../packetz/sPacket.h:1: note: sPacket::sPacket(const sPacket&)
Non mi preoccuperei voi, ma io non voglio trascorrere 2 ore con qualcosa di stupido ..... così thx per tutte le vostre risposte
Soluzione
Allo stato attuale, il codice ha bisogno di un costruttore di default per il tipo T. Modificare il costruttore di modello per:
tListItem(T t) : tData(t), next(0) {}
La differenza è che la versione di default costruisce un'istanza di tipo T e poi assegna ad esso. La mia versione utilizza un elenco di inizializzazione di copiare costruire l'istanza, quindi non è necessario alcun costruttore di default.
Altri suggerimenti
Ho ottenuto questo per costruire il mio proprio sistema, potrei sbagliarmi, ma penso che il problema è che non c'è un costruttore predefinito per sPacket:
class sPacket {
pubblico:
sPacket () {} // costruttore di default vuoto
sPacket (string s, int a) {s = s; a = a;}
};
Spero che questo è utile!
GCC può dividere i messaggi di errore in più rapporti al fine di descrivere i problemi che hanno più sedi. Potrebbe essere necessario leggere i messaggi come un unico messaggio, e può anche bisogno il messaggio che precede questo per dare un senso.
pubblicare anche i registri nel codice mark-up per forzarlo ad apparire Verbatim.