有問題的項目是關於不同的端點彼此通信。端點發送事件(超出當前問題的範圍),並可處理傳入事件。每個事件在一個通用對象中表示如下: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>;
試圖顯式實例,但無法擺脫上述鏈接錯誤。
任何想法,將不勝感激。
它可以在.cpp文件中實現,但它必須#included在頭文件中,以便實現可見。它不能自行編譯。按照這種方式組織時,通常會使用不同的文件擴展名(通常爲.inc)。 – 2010-05-05 11:08:06