2017-01-04 3 views
0

J'ai deux listes (listsub1 & listsub2) et je veux les combiner avec push_back à un (listclass).C++: Créer une liste sur deux listes avec des sous-classes (typedefs)

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); 
} 

Comment faire cela correctement? Voici le message d'erreur:

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

Il semble que vous ayez besoin de déplacer les pointeurs de 'Sous-classe1' à 'Basique '. Plutôt malheureux d'avoir des listes de classes dérivées, si vous allez l'aplatir quand même. – hauron

+1

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

+0

Le upcast devrait se faire implicitement. L'erreur suggère que 'Subclass1' n'est pas dérivé de' Basisclass', mais comme le code est incomplet, nous ne pouvons pas le dire. –

Répondre

0

Merci pour votre aide!

J'ai oublié d'inclure les fichiers d'en-tête:/ Maintenant, cela fonctionne correctement!

+0

C'est pourquoi vous êtes censé montrer le code ** complet ** que vous compilez, pas ce que vous * pensez * que vous compilez. Vous pensiez que les classes dérivaient de 'Basisclass' et vous nous montriez du code où c'était vrai mais ce n'était pas ce que vous compiliez vraiment. Nous ne pouvons pas vous aider si vous nous mentez. –