gpt4 book ai didi

c++ - Shared_ptr 没有可行的重载 '='

转载 作者:行者123 更新时间:2023-12-02 09:48:35 25 4
gpt4 key购买 nike

我的代码有什么问题:

class Game{
private:
mtm::Dimensions dimensions;
std::vector<std::shared_ptr<Character>> board;
};


std::shared_ptr<Character> Game::makeCharacter(CharacterType type, Team team, units_t health,
units_t ammo, units_t range, units_t power) {
std::shared_ptr<Character> out = nullptr;
if (type ==SNIPER)
out=mtm::Sniper(team,health,power,ammo,range);
return out;
}

我收到以下错误:

no viable overloaded '='        out=mtm::Sniper(team,health,power,ammo,range);

注意:Sniper继承自抽象类Character

我该如何解决这个问题?

最佳答案

您需要使用new构建 Sniper 时对象,例如:

out = std::shared_ptr<mtm::Sniper>(new mtm::Sniper(team,health,power,ammo,range));

或者更好,使用std::make_shared()安装:

out = std::make_shared<mtm::Sniper>(team,health,power,ammo,range);

out = mtm::Sniper(...)不起作用,因为 std::shared_ptr<Character>期待 Character* 获取所有权的指针(或另一个 std::shared_ptr<T> 与之共享所有权,其中 T 可转换为 Character )。您正在构建一个本地 Sniper对象,然后尝试将其分配给 shared_ptr ,但是 Sniper 对象不能隐式转换为 Character*指针,而是一个Sniper*指针是(因为 Sniper 派生自 Character )。

而且,默认情况下 std::shared_ptrdelete它拥有的指针(除非您提供不同的 deleter ),因此您需要使用 new (或 std::make_shared() )以确保对象是在动态内存中构造的,可以是 delete得妥妥的。这意味着new 'ing它。

关于c++ - Shared_ptr 没有可行的重载 '=',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62585586/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com