2010-12-02 70 views
5

好吧......首先我要解釋一下我以後的架構是什麼樣的。 StatMgrC++如何使用帶繼承的模板對象的模板集合?

我想爲我的Stats對象實現統計管理器。這個統計管理器是使用模板設計的(請參閱圖中的聲明).StatMgr擁有一個將字符串實現映射到智能指針(也是模板)的映射(不是STL),ARef。 StatMgr的特定子類在構造時靜態聲明其父級StatMgr的模板類(請參閱LStatMgr和RStatMgr),因此它們本身不是模板類。
這讓我做這樣的事情:

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

OR

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

但是那是老總連接器和夫人編譯器之前,決定聯手在進步阻止我嘗試(我還是要考功能和內存使用!)。
既然這樣我每類統計如下錯誤和警告:

\ StatsMgr.cpp(740):警告C4661: '無效StatsMgr :: vPrint()':沒有合適的 定義提供了一種用於顯式 模板實例請求
\ StatsMgr.cpp(740):警告C4661: '空隙StatsMgr :: vPrint()':提供用於明確 模板實例請求
沒有合適 定義\ StatsMgr.cpp (104):錯誤C2084: 功能 'StatsMgr :: StatsMgr(常量 枚舉doCollect,const int的)' 已有 主體
\ StatsMgr.cpp(104):錯誤 C2084:函數「StatsMgr :: StatsMgr(常量 枚舉doCollect,const int的) 「已經有 身體

現在關於警告 ::在行740有delarations像這樣:

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

我加了這一點,因爲如果我不做到這一點,我最終會遇到一連串的鏈接錯誤(見下文)。然而,在所有Stat子類中都有聲明和vPrint()的實現!

關於錯誤:基類「StatsMgr」具有已定義的COTR,子類(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。CPP

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

我試圖取代

class LStatMgr; 
class RStatMgr; 

的模板聲明,這被傳遞的編譯錯誤,但隨後的連接器找不到任何非重寫功能。例如,如果我在StatMgr中有一個名爲「getNextStat()」的函數並覆蓋RStatMgr中的函數而不是LStatMgr中的函數,那麼鏈接器會對此抱怨。爲什麼繼承不能涵蓋這種情況?



這讓我難過。我可能不得不回到作文(這應該是首選,但不是在這種情況下)。
順便說一句......我用MSVC++ 4.1(!!!)編譯,所以我明白你是否不能複製,但請幫忙。
謝謝,
丹尼斯。 (對於非常長的帖子感到抱歉)

+0

回讀了,我需要做出以下明確: StatMgr是一個模板類: 類StatMgr {...} StatMgr的 Subslasses不...例如: 類LStatMgr:公共StatMgr { ...} – Dennis 2010-12-02 17:44:40

+0

如果你想添加更多信息,你應該可以編輯你的問題 – 2010-12-02 18:00:11

回答

2

將模板代碼直接放在標題中,而不是單獨的CPP文件中。

請參閱this previous question的背景。

編輯:順便說一句我看你是在一個非常老的編譯器 - 這個問題可能是不可逾越的,即使VC6粗略的模板。