2010-05-05 64 views
0

有問題的項目是關於不同的端點彼此通信。端點發送事件(超出當前問題的範圍),並可處理傳入事件。每個事件在一個通用對象中表示如下:C++抽象類模板+特定於類型的子類=鏈接器故障

#pragma interface 
... // some includes 

template<typename T> 
class Event 
{ 
    public: 
         Event(int senderId, Type type, T payload); // Type is an enum 
         Event(int senderId, Type type, int priority, T payload); 
     virtual   ~Event(); 
     virtual int  getSenderId(); 
     virtual int  getPriority(); 
     virtual T  getPayload(); 
     void    setPriority(const int priority); 

    protected: 
     const int  senderId; 
     const Type  type; 
     const T   payload; 
     int    priority; 
}; 

它具有帶#pragma實現標記的實現類。

端點定義如下:

#pragma interface 
#include "Event.h" 

template<typename T> 
class AbstractEndPoint 
{ 
    public: 
         AbstractEndPoint(int id); 
     virtual   ~AbstractEndPoint(); 
     virtual int  getId(); 
     virtual void  processEvent(Event<T> event) = 0;  

    protected: 
     const int   id; 
}; 

它有它的實現類也一樣,但只有構造函數,析構函數的getId()被定義。

這個想法是爲每個不同的有效載荷類型創建具體的端點。因此,對於每種類型,我都有不同的有效載荷對象和特定事件類別。

Event<TelegramFormatA>, Event<TelegramFormatB> 

ConcreteEndPoint for TelegramFormatA, 
ConcreteEndPoint for TelegramFormatB 

分別。後者類定義爲

class ConcreteEndPoint : AbstractEndPoint<TelegramFormatA> 
{ 
    ... 
} 

我使用的是g ++ 4.4.3和ld 2.19。一切都很好地編譯,而是未定義的引用鏈接投訴鍵入特定的事件類,像

Event<TelegramFormatA>::Event(....) . 

我使用

template class AbstractEndPoint<TelegramFormatA>; 

試圖顯式實例,但無法擺脫上述鏈接錯誤。

任何想法,將不勝感激。

回答

3

類模板的函數模板和成員函數必須在頭文件中實現,而不是在.cpp文件中實現。我想你在.cpp文件中實現了Event<T>::Event()

0

正如sbi alread指出的,它不允許在源文件和頭文件中分離模板的接口和實現。檢查此鏈接的詳細信息(頁面結尾)http://www.cplusplus.com/doc/tutorial/templates/

+0

它可以在.cpp文件中實現,但它必須#included在頭文件中,以便實現可見。它不能自行編譯。按照這種方式組織時,通常會使用不同的文件擴展名(通常爲.inc)。 – 2010-05-05 11:08:06

0

我剛剛找到解決方案。相信與否,它與GNU鏈接程序(ld)的v2.20完美鏈接,但無法使用ld 2.19。

順便說

#pragma interface 

#pragma implementation 

是G ++ - 具體的解決方法解決在頭文件中執行的模板類的問題。使用pragma標籤可以避免它,所以這不是問題,但是無論如何感謝您的建議。