Кодируя вещи после получения подсказки из моего предыдущего ответа на вопрос, я столкнулся с проблемой перегрузки Scene :: addObject.
Чтобы повторить соответствующие биты и сделать их самодостаточными, с наименьшим количеством возможных деталей:
- У меня есть иерархия объектов, наследующих от
Interface
из которых естьFoo
иBar
; - У меня есть
Scene
которая владеет этими объектами; -
Foo
должен бытьunique_ptr
аBar
должен бытьshared_ptr
в моем main (по причинам, объясненным в предыдущем вопросе); -
main
передает их экземпляруScene
, который становится владельцем.
Минимальный пример кода это:
#include <memory>
#include <utility>
class Interface
{
public:
virtual ~Interface() = 0;
};
inline Interface::~Interface() {}
class Foo : public Interface
{
};
class Bar : public Interface
{
};
class Scene
{
public:
void addObject(std::unique_ptr<Interface> obj);
// void addObject(std::shared_ptr<Interface> obj);
};
void Scene::addObject(std::unique_ptr<Interface> obj)
{
}
//void Scene::addObject(std::shared_ptr<Interface> obj)
//{
//}
int main(int argc, char** argv)
{
auto scn = std::make_unique<Scene>();
auto foo = std::make_unique<Foo>();
scn->addObject(std::move(foo));
// auto bar = std::make_shared<Bar>();
// scn->addObject(bar);
}
Раскомментирование закомментированных строк приводит к:
error: call of overloaded 'addObject(std::remove_reference<std::unique_ptr<Foo, std::default_delete<Foo> >&>::type)' is ambiguous
scn->addObject(std::move(foo));
^
main.cpp:27:6: note: candidate: 'void Scene::addObject(std::unique_ptr<Interface>)'
void Scene::addObject(std::unique_ptr<Interface> obj)
^~~~~
main.cpp:31:6: note: candidate: 'void Scene::addObject(std::shared_ptr<Interface>)'
void Scene::addObject(std::shared_ptr<Interface> obj)
^~~~~
Раскомментирование общего доступа и комментирование уникального материала также компилируется, поэтому я считаю, что проблема, как говорит компилятор, в перегрузке. Однако мне нужна перегрузка, так как оба этих типа должны будут храниться в некоторой коллекции, и они действительно хранятся как указатели на базу (возможно, все они перемещены в shared_ptr
).
Я передаю оба значения по значению, потому что хочу прояснить, что я беру на себя ответственность в Scene
(и увеличиваю счетчик ссылок для shared_ptr
). Мне не совсем понятно, где проблема вообще, и я не смог найти ни одного примера в другом месте.