工作,我有一個基於模板類[Allotter.h & Allotter.cpp]:鏈接錯誤 '解析外部符號':使用模板
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;
};
,它的使用量顯示爲[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;
};
我沒有顯示完整的定義,因爲它並不重要。問題是當我編譯時,所有文件都能正確編譯。這些文件在一個VC++項目中。早些時候,當我沒有使用基於模板的方法Allotter
時,一切都在編譯和鏈接正常。但現在,我得到這個錯誤:
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)
令人吃驚的是,該構造,ActiveListener::ActiveListener()
不會使所有Allotter<QTcpSocket>::Allotter()
任何引用。然而第二個參考確實存在。但我不明白爲什麼鏈接器無法解析這個外部符號。
中出現錯誤之前生成的輸出是:
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...
我不明白,如果任何這是相關的,主要是因爲這一切完全使用之前的工作。這只是在我使用模板之後引起了一個問題。 任何幫助將不勝感激。非常感謝。
謝謝大家對您所提供的幫助量。我做了一些自己的研究,並找到了相同問題的解決方案:http://www.parashift.com/c++-faq-lite/templates.html#faq-35.13 我把它放在這裏對於偶然碰巧在這裏尋找解決類似問題的其他人。 再次感謝:D – 2009-12-06 04:46:34
[「未定義符號」鏈接器錯誤與簡單模板類的可能重複](http://stackoverflow.com/questions/999358/undefined-symbols-linker-error-with-simple-template-class ) – 2010-06-28 20:02:42