好吧......首先我要解釋一下我以後的架構是什麼樣的。 C++如何使用帶繼承的模板對象的模板集合?
我想爲我的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(!!!)編譯,所以我明白你是否不能複製,但請幫忙。
謝謝,
丹尼斯。 (對於非常長的帖子感到抱歉)
回讀了,我需要做出以下明確: StatMgr是一個模板類: 類StatMgr {...} StatMgr的 Subslasses不...例如: 類LStatMgr:公共StatMgr { ...} –
Dennis
2010-12-02 17:44:40
如果你想添加更多信息,你應該可以編輯你的問題 – 2010-12-02 18:00:11