2015-05-15 5 views
0

У меня есть шаблонный метод определяется какшаблона типа зависимых пакетов и наследования

template<class T> 
const std::list<T>& GetList() 
{ 
    return GetList(std::shared_ptr<Parent>(new T())); 
} 

const std::list<std::shared_ptr<Parent>>& GetList(const std::shared_ptr<Parent>&a) 
{ 
    // 
} 

Учитывая, что T является типом классов, которые принимают Родитель в качестве родительского класса, например, ошибка

class Child1:public Parent 
{}; 

Compilation: Can not convert const std::list<std::shared_ptr<Parent>>& to const std::list<T>&

Есть ли способ исправить это, не изменяя тип T в shared_ptr?

+3

Список shared_ptr из T - это другое дело из списка T. Это не просто случай несоответствия типа. Что вы пытаетесь достичь ? –

+0

У меня есть определенный метод 'Const зЬй :: Список <станд :: shared_ptr > & GetList (Const станд :: shared_ptr & а) { // }' Теперь мне нужно написать шаблон, чтобы сделать но он должен вернуть список T, которые являются подтипами родителя – user1458245

+1

И что будет с общими указателями? –

ответ

0

Определения должны соответствовать.

typedef std::shared_ptr<Parent> ParentPtr; 

std::list<ParentPtr> GetParentList(const ParentPtr& a) 
{ 
    // 
} 

template<class Child> 
std::list<ParentPtr> GetParentListT() 
{ 
    ParentPtr parent_ptr(new Child); 
    return GetList(parent_ptr); 
} 

... 
std::list<ParentPtr> my_list = GetParentListT<Child1>(); 

Кроме того, убедитесь, что Child1 определяется (и не только декларируется) перед использованием этого кода, в противном случае компилятор не будет знать, что это подкласс Parent.