2009-09-30 20 views
8

私はこれを理解できません。抽象テンプレートの基本クラスへのポインタ?


template <class T> class Dendrite 
{ 
    public: 
     Dendrite() 
     { 
     } 

     virtual ~Dendrite() 
     { 
     } 

     virtual void Get(std::vector<T> &o) = 0; 

    protected: 
     std::vector<T> _data; 
}; 

は今、私はデンドライトの正確な使用方法を指定するここから派生:私は次のようである 、抽象テンプレート基本クラスを持っている必要があります。

問題が発生しました。

特定の型のないベースクラスへのポインタのベクトルを作成するにはどうすればいいですか? 後で要素をプッシュすることで指定しますか?次のようなものがあります。

ここでは非常に基本的なものがありませんか?

template <class T> class Dendrite : public IDendrite 
{ 
     public: 
       Dendrite() 
       { 
       } 

       virtual ~Dendrite() 
       { 
       } 

       void Get(std::vector<T> &o) = 0; 

     protected: 
       std::vector<T> _data; 
}; 

、その後、あなたはIDendriteクラスはポインタとして保存することができます::

+0

類似:http://stackoverflow.com/questions/1479498/how-to-subclass-a-templated-base -クラス –

答えて

14

は、通常は、インターフェイスクラスから継承するテンプレート、IEで行われている中で、

std::vector<IDendrite*> m_dendriteVec; 

しかし、あなたの状況によっては、テンプレートパラメータをインタフェースの一部として使用しています。これもまたラップする必要があります。

class IVectorParam 
{ 
} 

template <class T> 
class CVectorParam : public IVectorParam 
{ 
    std::vector<T> m_vect; 
} 

あなた

class IDendrite 
{ 
    ... 
public: 
    virtual ~IDendrite() 
    virtual void Get(IVectorParam*) = 0; 
} 

template <class T> class Dendrite : public IDendrite 
{ 
    ... 
    // my get has to downcast to o CVectorParam<T> 
    virtual void Get(IVectorParam*); 
}; 
0

を与えてはいそれは可能です。仮想関数と仮想デストラクタを提供するようにしてください。さらに、typeidを使用して実際のタイプを取得することもできます(タイプを確認するdynamic_castと同様)。

関連する問題