2011-06-22 9 views
0

私は次のようにしたいと思います。継承、ポリシーとテンプレートが混在

私は現在、私たちの懸念事項ではないいくつかの要素で、次のようなクラスを持っています。

template<class A> 
class Domain 
{ 

}; 

私の問題は、いくつかの新しいオブジェクトをこのクラスのメンバーにしたいということです。しかし、私はこの定義でそれらを指定することはできません。他のファイルで指定する必要があります。次のように私の最初に考えたのは、継承を使用していました:

template<class G,class ctype> 
class Data 
{ 
    public: 
    Data(G& g_); 
    protected: 
    std::vector<ctype> data1; 
}; 

、その後

template<class A> 
class Domain : public Data<A,A::ctype> 
{ 
    public: 
     Domain(A& a); 
     void writeData(data1); 
}; 
template<class A> 
Domain<A>::Domain(A& a) 
{ 

} 

をしかし、私はそれをコンパイルするために取得することができていませんでした。 これについてどうすればよいですか? この方法をよりクリーンな方法で行う方法はありますか?

完全なプログラムは次のとおりです。ヘッダーファイル内にのみあります。私はまだインスタンスを作成していません。プログラムは

28 template<class GV, class Data> 
29 class System : public Data<GV,GV::ctype> 
30 { 
31  private: 
32  typedef Dune::VTKWriter<GV> VTKWriter; 
33  GV& gv_; 
34  VTKWriter vtkwriter_; 
35 
36 public: 
37  System(GV& gv); 
38  void writeSystemInfo(std::string outfile); 
39 }; 
40 
41 template<class GV, class Data> 
42 System<GV,Data>::System(GV& gv) : gv_(gv) , vtkwriter_(gv) 
43 { 
44 } 
45 
46 template<class GV,class Data> 
47 void System<GV,Data>::writeSystemInfo(std::string outfile) 
48 { 
49  Data::addDatatoVTK(); 
50  vtkwriter_.write(outfile, Dune::VTKOptions::binaryappended); 
51 } 

であり、エラーが

../dune/simulationlab/system/system.hh:29:29: error: expected template-name before ‘<’ token 
../dune/simulationlab/system/system.hh:29:29: error: expected ‘{’ before ‘<’ token 
../dune/simulationlab/system/system.hh:29:29: error: expected unqualified-id before ‘<’ token 
../dune/simulationlab/system/system.hh:46:33: error: invalid use of incomplete type ‘class Dune::System<GV, Data>’ 
../dune/simulationlab/system/system.hh:29:9: error: declaration of ‘class Dune::System<GV, Data>’ 
../dune/simulationlab/system/system.hh:52:60: error: invalid use of incomplete type ‘class Dune::System<GV, Data>’ 
../dune/simulationlab/system/system.hh:29:9: error: declaration of ‘class Dune::System<GV, Data>’ 
+0

私はクラスDomainの複数の宣言を望みません。 –

+2

'writeData(data1);'行が関数呼び出しか関数宣言であるとしますか?それはどちらでもないからです。また、コンストラクタの定義が宣言と一致せず、場所のセミコロンが不足しています。 – interjay

+0

申し訳ありません...私はちょっと早くそれを書きました... 実際にプログラムが長すぎます 私はそれを短縮してキーポイントを強調しようとしました 私はそれを修正します... –

答えて

0

A :: CTYPEメンバコール、ないタイプとして見られています。 typenameキーワードを使用してください:

template<class A> 
class Domain : public Data<A,typename A::ctype> 
{ 
    public: 
     Domain(A& a); 
}; 
+0

ohk ...私は今それを試しました....... しかし、私はstilllをコンパイルすることができません –

+1

あなたの最新のアップデートでは、typenameとして過去のもののテンプレートインスタンスをインスタンス化しようとしています。テンプレートそのもの。私は、このような再帰的なテンプレート化が許可されている(または動作が定義されている)とは思わない。 – KillianDS

+0

hmmm .... ohk ...とにかく..ありがとう –