2012-01-14 9 views
3
は、2つのクラスAとBがあり

は、Aは、基本クラスであり、Bは、派生クラスである:C++、関数の引数のtemplatization対多型

template <typename T> 
class A {T a;}; 

template <typename T> 
class B: public A <T> {T b;}; 

変性容器

を表す次のクラス
template <typename Item> 
struct TItems {typedef std::vector <Item> Type;}; 

template <typename Item> 
class ModCont 
{ 
    private: 
      typename TItems <Item>::Type items; 
}; 

機能試験は、()仮パラメータとしてオブジェクトのコンテナへのポインタを有する。

template <typename T> 
void test (ModCont <A <T> > *it) {} 

Iが多型を適用し、方法試験にBの容器を通過したい:

int main(int argc, char* argv[]) 
{ 

    ModCont < A <double> > a_items; 
    ModCont < B <double> > b_items; 
    test (&a_items); //Works 
    test (&b_items); //Does not work 
    return 0; 
} 

Iが見出さ唯一の方法は、このように試験()メソッドのパラメータをテンプレート化することである。

template <typename Object> 
void test (ModCont <Object> *it) {} 

代わりにコンパイル多型の「機能」多型(テンプレート?)あなたの助けを

感謝の使用方法をどのような方法があります...

+0

あなたはひどく混乱しています:(1)テンプレートは多態性の形です(2)テンプレートはコンパイル時に特化されていますが、ランタイムではありません。 – Marcin

+0

@Marcin:あなたのコメントありがとう... – justik

+2

あなたの関数 'test'は、与えられたように、メソッドではなく自由な関数です。問題を示す最小限のコンパイル可能なコードを表示してください。実際に行ったことを推測する必要はありません。 – celtschk

答えて

3

まず、テンプレートはではありません。ランタイムポリモーフィズム - コンパイル時の多型です。

ランタイムポリモーフィズムを使用する場合は、ModCont<B<T> >ModCont<A<T> >から派生していることを確認する必要があります.C++で多態性を処理する方法ではこれがデフォルトになりません。あるいは、ModCont<T>は一般的なものであるModContBaseから派生させることができますが、それがどのように機能するかは不明です。

+0

ちょうど注意してください:他の方法で実行時多型である 'ModCont'を私たちに示していないので、テンプレートはとにかく(参照渡しと一緒に)行く方法です。 –

+0

私は思ったよりも速く書いた。それはもちろん、実行時の多型性ではありません... – justik

3

リンゴがFRUでありますそれ。

リンゴの袋はフルーツの袋ではありません。果物の袋に梨を入れることができるからです。

0

コンテナをAではなくA *にする必要があります。U *のコンテナを取得し、そのコンテナの内容を自身に追加するコンストラクタも必要です。