У меня есть метод
void foo(list<shared_ptr<Base>>& myList);
Который я пытаюсь вызвать с помощью двух разных типов списков, одного из DerivedClass1 и одного из DerivedClass2
list<shared_ptr<DerivedClass1>> myList1;
foo(myList1);
list<shared_ptr<DerivedClass2>> myList2;
foo(myList2);
Однако это, очевидно, приводит к ошибке компилятора
error: a reference of type "std::list<boost::shared_ptr<Base>, std::allocator<boost::shared_ptr<Base>>> &" (not const-qualified) cannot be initialized with a value of type "std::list<boost::shared_ptr<DerivedClass1>, std::allocator<boost::shared_ptr<DerivedClass1>>>"
Есть ли простой способ разыграть контейнер shared_ptr? Из альтернативных контейнеров, которые могут это сделать?
Обновление : Спасибо всем, кто откликнулся. Работая в пределах языка, кажется, что лучший способ сохранить метод «как есть» - это использовать контейнер shared_ptr и передать его точно (создание нового списка на сайте вызова).
Полагаю, я уже почти знал это, но я вспомнил, как читал о других частях библиотеки boost, связанных с контейнерами shared_ptr, и подумал, что, может быть, кто-то другой уже решил более элегантно. Однако из моих собственных дальнейших исследований они, похоже, больше направлены на снижение накладных расходов на shared_ptr в тех случаях, когда несколько указателей принадлежат исключительно (следовательно, требуется одна блокировка на контейнер, а не одна на объект в контейнере).
Еще раз спасибо, вы, ребята, все классные!