При написании кода после подсказки из моего предыдущего вопроса я столкнулся с проблемой перегрузки Scene :: addObject.
Чтобы повторить соответствующие биты и сделать это самостоятельносодержится с наименьшим возможным количеством деталей:
- У меня есть иерархия объектов, наследующих от
Interface
, из которых есть Foo
s и Bar
s; - У меня есть
Scene
, которому принадлежат эти объекты; Foo
s должно быть unique_ptr
s, а Bar
s должно быть shared_ptr
s в моем главном (по причинам, объясненным в предыдущем вопросе); main
передает их экземпляру Scene
, который становится владельцем.
Пример минимального кода this :
#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
s).
Я передаюоба по значению, потому что я хочу дать понять, что я беру в собственность Scene
(и увеличиваю счетчик ссылок для shared_ptr
s).Мне не совсем понятно, где проблема вообще, и я не смог найти ни одного примера в другом месте.