Обычно вы пишете:
void callByFoo(Foo* foo) {
}
int main() {
Boo* bp = new Boo();
callByFoo(bp);
}
Но при использовании умного ptr вы инициализируете ссылки, поэтому у вас есть ссылки на различные типы, поэтому это не работает:
void callByFoo(std::unique_ptr<Foo>& fooRef) {
}
int main() {
std::unique_ptr<Boo> bp = std::make_unique<Boo>();
callByFoo(bp);
}
Iпредположим, что сравнение с первым примером выглядит так:
void callByFoo(Foo*& fooRef) {
}
int main() {
Boo* bp = new Boo();
callByFoo(bp);
}
Поэтому, чтобы заставить его работать, используйте базовый указатель, и типы будут совпадать, как в этом примере:
void callByFoo(std::unique_ptr<Foo>& fooRef) {
}
int main() {
std::unique_ptr<Foo> bp = std::make_unique<Boo>();
callByFoo(bp);
}
В вашемНапример, вам, очевидно, придется изменить методы на виртуальные, и сигнатура функции будет выглядеть следующим образом:
void doSomething(std::vector<std:unique_ptr<Foo>>& booList)
{
// removed for brevity
}