2010-12-02 14 views
5

さて、私はちょうど私が外観の後の建築について何かを説明するつもりです。 StatMgrC++テンプレートオブジェクトのテンプレートコレクションを継承で使用するにはどうすればよいですか?

私はStatsオブジェクト用のStats Managerを実装しようとしています。この統計マネージャーは、テンプレートを使って設計されています(写真の宣言を参照)。StatMgrは文字列の実装をスマートポインター(テンプレートでもあります)、ARefにマップするマップ(STLではなく)を保持します。 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(); 

を機能とメモリの使用!)。それは私がSTATクラスごとに、次のエラーと警告持って立ったよう
:。

を\ StatsMgr.cpp(740): '無効StatsMgr :: vPrint()':C4661警告なしに適し 定義明示的な テンプレートのインスタンスの要求のために提供
\ StatsMgr.cpp(740):警告C4661: '無効StatsMgr :: vPrint()':明示的な テンプレートインスタンス要求
のために提供なしに適し 定義\ StatsMgr.cpp (104):エラーC2084: 関数 'StatsMgr :: StatsMgr(constの 列挙doCollect、のconst int型)' は既に 体
を持っている\ StatsMgr.cpp(104):エラー C2084:関数「StatsMgr :: StatsMgr(constの 列挙doCollect、のconst int型) 'は既に今の警告にに関する 体

を持っている::ライン740でようdelarationsあります

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

は私がいない場合、私はこのために追加そうすれば、私はリンカエラーの混乱で終わる(下記参照)。しかし、すべての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; 

を代入しようと、これはコンパイルエラーを渡されるが、その後、リンカーは、任意の非オーバーライドされた関数を見つけることができません。たとえば、StatMgrに "getNextStat()"という関数があり、それをRStatMgrではオーバーライドしますが、LStatMgrではオーバーライドしていない場合、リンカーはそれについて文句を言います。なぜこのような状況を継承していないのですか?



私は悲しいです。私は構成に落ちなければならないかもしれません(これが好ましいはずですが、この状況ではありません)。
ところで...私はMSVC++ 4.1(!!!)でコンパイルしていますので、複製できない場合は分かりますが、助けてください。
ありがとう、
デニス。 (非常に長い投稿についてはごめんなさい)

+0

私は次明確にする必要があることを振り返っ読む: StatMgrはテンプレートクラスである: クラスStatMgr StatMgrの {...} Subslassesは例えば...ではありません。 クラスLStatMgr:公共StatMgr { ...} – Dennis

+0

詳細を追加したい場合は質問を編集できます –

+0

@Steve - Cheers、それも同様です。 :) – Dennis

答えて

2

テンプレートコードは、別のCPPファイルではなく、ヘッダーに直接入力してください。

背景についてはthis previous questionを参照してください。

EDIT:btw私はあなたが非常に古いコンパイラであることを見ています - この問題は克服できないかもしれません、VC6でもテンプレートのためのスケッチです。

+0

スティーブ、ありがとう、私は明日行くことを与えます。クリスマスパーティーの時間...(アイルランド時間)。あなたは知っているだろう。 – Dennis

+1

あなたは「明日の午後」を意味しています... –

+0

これはうまくいきました。 :) 午前11時には...昨晩のパーティーを考えているとかなりいいよ... 乾杯スティーブ。 – Dennis

関連する問題