2011-07-16 30 views
1
class A { } 

class B : public A { } 

std::vector<B*> things; 

void Func1(const std::vector<B*>& Bthings) {} 
void Func2(const std::vector<A*>& Athings) {} 

Func1(things); // ok 
Func2(things); // not ok 

私は上記のようなコードにいくつか問題があります。オブジェクトへのポインタのstlコレクションがありますが、私はFunc2にサブクラスを認識させたくありません。これを行うには良い方法がありますか?私はstd::vector<B*>std::vector<A*>ではないことを知っていますが、これはまれな問題だとは思いません。私が考えることができるのは、ちょうど間違っているA *とB *の2つの別々のリストを持つことです。stlコレクションと多型

答えて

2

は、私は、これはまれな問題

それは珍しい問題ではありませんだと思うことはできません。解決策はしかし、角を曲がったところです:

template <typename T> 
void Func2(const std::vector<T*>& Athings) {} 

は確かに、これはおそらくあなたが探していたものではありませんが、それは最も近いものです。コンパイル時の多態性(テンプレート、オーバーロード)とランタイムポリモーフィズム(関数のオーバーライドとクラス継承)を混在させることはうまく機能しません。

あなたのケースでは上記を受け入れることができない場合は、ベクタ全体をコピーすることをお勧めします。

+0

テンプレートはそれほど素晴らしいものではありませんが、私は "全体のベクトルをコピーする" – DanDan

0

これらの機能をメンバー機能にして、をプライベートにすることが1つの解決策です。

+0

関数が異なるライブラリに属しているかどうかはわかりません。 – DanDan