2017-01-04 4 views
0

두 목록 (listsub1 & listsub2)을 가지고 있으며 이들을 하나의 (listclass)에 push_back과 결합하려고합니다.C++ : 하위 목록 (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); 
} 

어떻게하면 제대로 할 수 있습니까? 다음은 오류 메시지입니다.

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'에서 파생 된 클래스를 생각하고 그 코드가 실제로 어디에 있었는지 코드를 보여 주었지만 실제로 컴파일 한 코드가 아니라고 생각했습니다. 네가 우리에게 거짓말하면 너를 도울 수 없어. –