2010-05-05 6 views
0

해당 프로젝트는 서로 통신하는 서로 다른 종점에 대한 것입니다. 엔드 포인트는 이벤트를 보내고 (현재 문제점의 범위를 벗어남) 들어오는 이벤트를 처리 할 수 ​​있습니다. 각 이벤트는 다음과 같이 일반 객체로 표시됩니다. #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(....) . 

같은 이벤트 클래스 특정 입력 할 수 있지만, 상기 링커 오류 과거 가져올 수 없습니다.

모든 아이디어를 얻을 수 있습니다.

답변

3

클래스 템플릿의 함수 템플릿과 멤버 함수는 .cpp 파일이 아니라 헤더 파일에 구현되어야합니다. .cpp 파일에 Event<T>::Event()이 구현되어 있다고 가정합니다.

0

sbi alread가 지적했듯이 소스 및 헤더 파일에서 템플릿의 인터페이스와 구현을 분리 할 수 ​​없습니다. 자세한 내용은이 링크를 확인하십시오 (페이지 끝) http://www.cplusplus.com/doc/tutorial/templates/

+0

구현이 .cpp 파일로 허용되지만 구현이 표시되도록 헤더 파일에 #include되어야합니다. 그것 자체로도 컴파일해서는 안됩니다. 이 방식으로 구성되면 일반적으로 다른 파일 확장명 (일반적으로 .inc)이 사용됩니다. –

0

방금 ​​해결책을 찾았습니다. 믿거 나 말거나, GNU 링커 (ld)의 v2.20과 완벽하게 연결되지만 ld 2.19에서는 그렇게하지 않습니다. 헤더 파일에 템플릿 클래스를 구현하는 문제를 해결하는 구체적인 해결 방법 - 방법

#pragma interface 

#pragma implementation 

으로

는 g ++이다. pragma 태그를 사용하면 피할 수 있으므로 문제는 아니지만 어쨌든 귀하의 제안에 감사드립니다.