наследование, политика, смешанная с шаблонами - PullRequest
0 голосов
/ 22 июня 2011

Я хочу сделать что-то вроде следующего.

У меня есть следующий класс с некоторыми элементами, которые сейчас нам не нужны.

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>’

1 Ответ

0 голосов
/ 22 июня 2011

A :: ctype рассматривается как вызов члена, а не как тип.Вы должны использовать ключевое слово typename:

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