2010-12-02 4 views
5

좋아요 ... 우선 제가 생각한 건축물에 대해 설명하겠습니다. StatMgrC++ 템플릿 개체의 템플릿 컬렉션을 상속과 함께 사용하려면 어떻게해야합니까?

내 통계 개체 용 통계 관리자를 구현하려고합니다. 이 통계 관리자는 템플릿을 사용하여 설계되었습니다 (사진의 선언 참조). StatMgr는 문자열 구현을 스마트 포인터 (템플릿이기도 함), ARef에 매핑하는 맵 (STL 아님)을 보유합니다. StatMgr의 특정 하위 클래스는 건설중인 부모 StatMgr의 템플릿 클래스를 정적으로 선언하므로 (LStatMgr 및 RStatMgr 참조) 자체는 템플릿 클래스가 아닙니다. (난 아직도 테스트해야 그 아저씨 링커와 부인 컴파일러 전과 그러나

LStatMgr myLStatMgr(10); 
if(myLStatMgr.remove(acKey)) 
    cout << "Remove was good" << endl; 
//No need to delete :) 

또는

ARef<LStat> oLStat = NULL; 
myLStatMgr.getNextStat(acKey,oLStat); 
if(oLStat != NULL) 
    oLStat->doSomethingLStatLike(); 

가 힘을 합쳐 진행에 나의 시도를 저지하기로 결정
이 나를 등의 작업을 수행 할 수 있습니다 기능 및 메모리 사용!). 그것이 내가 합계 클래스에 따라 다음과 같은 오류 및 경고가 의미로
:.

을 \ StatsMgr.cpp (740) : '무효 StatsMgr :: vPrint() : C4661 경고없이 적합한 정의 명시 적 템플릿 인스턴스화 요청을 제공
\ StatsMgr.cpp (740). 경고 C4661 : '무효 StatsMgr :: vPrint()'. 명시 적 템플릿 인스턴스화 요청
제공없이 적합 정의 \ StatsMgr.cpp (104) : 오류 C2084 : 함수 'StatsMgr :: StatsMgr (CONST는 ENUM doCollect, CONST의 INT)은 "이미 본체
을 갖는다 \ StatsMgr.cpp (104). 에러 C2084 : 함수'StatsMgr :: StatsMgr (CONST ENUM doCollect, CONST의 INT) 나는이 추가

template class StatsMgr<LStat>; 
template class StatsMgr<RStat>; 

내가하지 않기 때문에 경우 '이미 은 몸 지금이 :: 라인 (740)에서 않도록 delarations가 경고에 대한


있다 그렇게하면 링커 에러가 뒤죽박죽이된다. 그러나 모든 Stat 하위 클래스에서 vPrint()의 선언과 구현이 있습니다!

오류 : 기본 클래스 "StatsMgr"에는 하위 클래스 (LStatMgr & RStatMgr)와 마찬가지로 정의 된 COTR이 있습니다. 왜 상속은 이것을 간단하게 분류하지 않는가? 분명히 이것은 CPP의 끝 부분에있는 명시 적 템플릿 인스턴스와 관련이 있지만 정확히 무슨 일이 벌어지고 있는지 이해할 수는 없습니다.
다음은 StatsMgr.cpp

에서 아래
template<class type> 
StatsMgr<type>::StatsMgr(const doCollect eOption, const int nListSize) : 
    oMyMap(wHashString, nListSize), oMyMapIter(oStatsList) 
{ 
    m_eCollectionOption = eOption; 
} 

LStatMgr에서입니다.

LStatMgr::LStatMgr(const doCollect eOption, const int nListSize) : 
StatsMgr<LStat> (eOption, nListSize) 
{ 
} 

CPP

나는 템플릿 선언에 대한

class LStatMgr; 
class RStatMgr; 

대체 노력이는 컴파일 오류가 전달되는하지만 링커가 오버라이드 (override)되지 않는 기능을 찾을 수 없습니다. 예를 들어 StatMgr에 "getNextStat()"이라는 함수가 있고이를 RStatMgr에서는 무시하지만 LStatMgr에서는 재정의하지 않으면 링커에서 그에 대해 불평합니다. 상속이이 상황을 다루지 않는 이유는 무엇입니까?



나를 슬프게합니다. 나는 작곡으로 되돌아 가야 할 수도 있습니다 (이 상황에서 선호되는 것이지, 바람직하지는 않습니다).
그런데 ... MSVC++ 4.1 (!!!)로 컴파일 중이므로 복제 할 수 없지만 도움을 받으십시오.
고마워요,
데니스. (매우 긴 게시물에 대해 미안)

+0

내가 할 필요가 있음을 다시 위에 읽는 맑은 다음 StatMgr {...} StatMgr의 Subslasses이 예 ...없는 클래스 : 클래스 LStatMgr : 공공 StatMgr { StatMgr 템플릿 클래스입니다 ...} – Dennis

+0

더 많은 정보를 추가하려면 질문을 편집 할 수 있어야합니다. –

+0

@Steve - 건배도 마찬가지입니다. :) – Dennis

답변

2

별도의 CPP 파일이 아닌 헤더에 템플릿 코드를 직접 입력하십시오.

배경에 대해서는 this previous question을 참조하십시오.

EDIT : btw 나는 아주 오래된 컴파일러에있는 것을 본다.이 문제는 극복 할 수 없을 수도있다. 심지어 VC6도 템플릿을위한 스케치가된다.

+0

스티브, 고마워요. 내일 갈께. 크리스마스 파티를위한 시간 ... (아일랜드 시간). 나중에 알려 드리겠습니다. – Dennis

+1

당신은 '내일 오후'를 의미합니다 ... –

+0

이것은 효과가있었습니다. :) 오전 11 시까 지 시험 ... 어젯밤 파티를 생각해 보는 것이 좋습니다 ... 환호성 Steve. – Dennis

관련 문제