해당 프로젝트는 서로 통신하는 서로 다른 종점에 대한 것입니다. 엔드 포인트는 이벤트를 보내고 (현재 문제점의 범위를 벗어남) 들어오는 이벤트를 처리 할 수 있습니다. 각 이벤트는 다음과 같이 일반 객체로 표시됩니다. #pragma implementation 태그를 사용하여 구현 클래스가 있습니다.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 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
. 나는 4.4.3 및 LD 2.19 ++ g을 사용하고
class ConcreteEndPoint : AbstractEndPoint<TelegramFormatA>
{
...
}
으로 후자의 클래스 정의된다. 모든 것이 잘 컴파일하지만 정의되지 않은 참조에 대한 링커 불만 내가
template class AbstractEndPoint<TelegramFormatA>;
를 사용하여 명시 적 인스턴스화를 시도
Event<TelegramFormatA>::Event(....) .
같은 이벤트 클래스 특정 입력 할 수 있지만, 상기 링커 오류 과거 가져올 수 없습니다.
모든 아이디어를 얻을 수 있습니다.
구현이 .cpp 파일로 허용되지만 구현이 표시되도록 헤더 파일에 #include되어야합니다. 그것 자체로도 컴파일해서는 안됩니다. 이 방식으로 구성되면 일반적으로 다른 파일 확장명 (일반적으로 .inc)이 사용됩니다. –