恐怕我觉得我在这里遗漏了一些东西并希望得到一些帮助。我在网上搜索过(也许不是很好),但我找不到帮助我的信息。
我有一个场景,我想创建三个单独的向量,所有向量都包含不同类型的shared_ptrs。所以我想要一个包含Enemy对象的shared_ptrs和包含shared_ptrs到Enemy2对象的向量的向量。
之前我已成功使用了shared_ptrs的向量,但如果我没记错的话,我只需要存储相同的类型,因此没有任何问题。我目前正试图像这样实现它:
// Defining my vectors
std::vector<std::shared_ptr<Enemy1>> enemyVec1;
std::vector<std::shared_ptr<Enemy2>> enemyVec2;
// Creating new enemy objects and putting in to vector
std::shared_ptr<Enemy1> enemy1(new Enemy());
std::shared_ptr<Enemy2> enemy2(new Enemy());
enemyVec1.push_back(enemy1);
enemyVec2.push_back(enemy2);
以下是错误消息:
c:\program files (x86)\microsoft visual studio 10.0\vc\include\memory(1705): error C2664: 'std::tr1::_Ptr_base<_Ty>::_Reset0' : cannot convert parameter 1 from 'Enemy *' to 'Enemy2 *'
我模糊地熟悉这里可能发生的事情,但我并不是百分百肯定。我甚至不太确定如何以“正确”的方式编写这个方法,因为我看到的很多例子似乎都没有涵盖不同类型的shared_ptrs的使用。
如果我取出对Enemy2类和类的所有引用,并且只对一种类型使用shared_ptrs,那么代码工作正常。我以为我知道shared_ptrs是如何工作的但我显然不是这样,我需要阅读更多关于它们的信息。
但与此同时,有人可以向我解释我在这里做错了吗?
由于
答案 0 :(得分:2)
您正在使用enemy1
初始化enemy2
和new Enemy()
。只有在Enemy
和Enemy1
同时导出Enemy2
时,此功能才有效。我怀疑是这样,因此错误。
我相信您应该使用相应类型Enemy1
和Enemy2
的实例初始化它们。您还应该考虑使用std::make_shared
:
auto enemy1 = std::make_shared<Enemy1>();
auto enemy2 = std::make_shared<Enemy2>();
答案 1 :(得分:0)
看起来指向Enemy2的指针并不是指向敌人的指针,这很可能意味着Enemy2不会继承敌人。尽管如此,一切看起来都像为Enemy1工作。