ho una classe template basato [Allotter.h & Allotter.cpp]:errore del linker 'simbolo esterno non risolto': lavorare con i modelli
template <typename allotType> class Allotter {
public:
Allotter();
quint32 getAllotment(allotType*);
bool removeAllotment(quint32, int auto_destruct = 0);
private:
QVector<QPair<quint32, allotType*>> indexReg;
int init_topIndex;
};
ed è l'utilizzo è indicato come [ActiveListener.h & ActiveListener. cpp]:
class ActiveListener: public QObject {
Q_OBJECT
public:
ActiveListener();
private slots:
void processConnections();
void readFromSocket(int);
private:
QTcpServer* rootServer;
QSignalMapper* signalGate;
Allotter<QTcpSocket> TcpAllotter;
};
Non sto mostrando le definizioni complete, poiché non ha molta importanza. Il problema è quando compilo, tutti i file vengono compilati correttamente. I file si trovano in un progetto VC++. In precedenza, quando non usavo un approccio basato su modelli per Allotter
, tutto era compilato e collegato bene. Ma ora, ottengo questo errore:
1>ActiveListener.obj : error LNK2019: unresolved external symbol "public: __thiscall Allotter<class QTcpSocket>::Allotter<class QTcpSocket>(void)" ([email protected]@@@@[email protected]) referenced in function "public: __thiscall ActiveListener::ActiveListener(void)" ([email protected]@[email protected])
1>ActiveListener.obj : error LNK2019: unresolved external symbol "public: unsigned int __thiscall Allotter<class QTcpSocket>::getAllotment(class QTcpSocket *)" ([email protected][email protected]@@@@[email protected]@@Z) referenced in function "private: void __thiscall ActiveListener::processConnections(void)" ([email protected]@@AAEXXZ)
La cosa sorprendente è che il costruttore, ActiveListener::ActiveListener()
non fa alcun riferimento a tutti Allotter<QTcpSocket>::Allotter()
. Il secondo riferimento tuttavia esiste. Ma non capisco perché il linker non sia in grado di risolvere questo simbolo esterno.
L'uscita costruire poco prima della comparsa degli errori è:
1>Moc'ing ActiveListener.h...
1>Compiling...
1>stdafx.cpp
1>Compiling...
1>ActiveListener.cpp
1>Allotter.cpp
1>moc_ActiveListener.cpp
1>main.cpp
1>Generating Code...
1>Linking...
Non capisco se niente di tutto questo è rilevante, soprattutto perché tutto questo usato per funzionare perfettamente prima. È solo che dopo aver usato i modelli è stato causato un problema. Qualsiasi aiuto sarà apprezzato. Molte grazie.
Grazie a tutti per la quantità di aiuto che ci hai fornito. Ho fatto un po 'di ricerca la mia auto e hanno trovato un po' una soluzione per lo stesso problema: http://www.parashift.com/c++-faq-lite/templates.html#faq-35.13 sto mettendo qui per gli altri che capita di inciampare qui alla ricerca di soluzioni a problemi simili. Grazie ancora: D –
possibile duplicato dell'errore di collegamento ["Simboli non definiti" con semplice classe modello] (http://stackoverflow.com/questions/999358/undefined-symbols-linker-error-with-simple-template-class) –