2017-01-04 3 views
0

私は2つのリスト(listsub1 & listsub2)を持っており、それらをpush_backと組み合わせて1つ(listclass)にします。C++:サブクラス(typedefs)を使用して2つのリストから1つのリストを作成

class Subclass1 : public Basisclass {...}; 
class Subclass2 : public Basisclass {...}; 

//... 

typedef std::list<std::shared_ptr<Basisclass> > ListClass; 
typedef std::list<std::shared_ptr<Subclass1> > ListSubclass1; 
typedef std::list<std::shared_ptr<Subclass2> > ListSubclass2; 

//... 

ListSubclass1 listsub1 = ... 
ListSubclass2 listsub2 = ... 

//... 

ListClass listclass; 
for (const std::shared_ptr<Subclass1> pSubclass1 : listsub1) 
{ 
    listclass.push_back(pSubclass1); 
} 
for (const std::shared_ptr<Subclass2> pSubclass2 : listsub2) 
{ 
    listclass.push_back(pSubclass2); 
} 

これを正しく行うにはどうすればよいですか? エラーメッセージは次のとおりです。

error: no matching function for call to 'std::list<std::shared_ptr<Basisclass> >::push_back(const std::shared_ptr<Subclass1>&)' 
     listclass.push_back(pSubclass1); 
+1

'Subclass1'から' Basicclass'にアップキャストポインタが必要なようです。とにかくそれを平坦化しようとするならば、派生クラスのリストを持つことは不幸です。 – hauron

+1

['std :: static_pointer_cast'](http://en.cppreference.com/w/cpp/memory/shared_ptr/pointer_cast) – NathanOliver

+0

アップキャストは暗黙的に行われるべきです。このエラーは 'Subclass1'が' Basisclass'から派生したものではないことを示唆していますが、コードが不完全であるためわかりません。 –

答えて

0

ありがとうございます!

ヘッダーファイルを含めるのを忘れてしまった:/ これで正常に動作しました。

+0

あなたはコンパイルしていると思うものではなく、あなたがコンパイルしている**完全な**コードを表示するはずです。あなたは 'Basisclass'から派生したクラスと、それが真実であった場所をコードで示したと思ったのですが、実際にコンパイルしたものではありませんでした。あなたが私たちに横たわっているなら、あなたを助けることはできません。 –

関連する問題