gpt4 book ai didi

c++ - 错误 : no matching function for call to 'std::vector::vector()'

转载 作者:行者123 更新时间:2023-11-28 01:15:11 25 4
gpt4 key购买 nike

您好,我需要帮助修复此 C++ 错误。我正在尝试创建一个返回包含宠物对象的 vector 的函数。我尝试使用 pushback,仍然无法编译。我还有很多其他类(猫、狗、鱼等)也继承了基础宠物类。

这是我的函数的片段。

std::vector<Pet*> make_pets() {

//why doesn't this work?
std::vector<Pet*> newVector {Cat(), Dog()};
return newVector;
//newVector.push_back(c);


}

最佳答案

OPs代码错误:

std::vector<Pet*> newVector {Cat(), Dog()};

Cat()创建 Cat 的临时实例.类型是 Cat (或 Cat& )。std::vector<Pet*> 的元素类型是Pet*这是不兼容的。应用地址运算符 ( &Cat() ) 会使事情变得更糟。尽管类型现在会匹配(如果 Cat* 派生自 Pet*,则 Cat 可以分配给 Pet),Cat()创建一个临时实例。它没有提供足够的生命周期,因为它会在表达式结束时自动销毁,这会在 std::vector 中留下悬空指针。 .

要解决此问题,new可以使用:

std::vector<Pet*> newVector {new Cat(), new Dog()};

coliru 上的 MCVE:

#include <iostream>
#include <memory>
#include <vector>

struct Pet {
virtual ~Pet() = default;
virtual const char* what() const = 0;
};

struct Cat: public Pet {
virtual const char* what() const override { return "cat"; }
};

struct Dog: public Pet {
virtual const char* what() const override { return "dog"; }
};

std::vector<Pet*> make_pets()
{
std::vector<std::unique_ptr<Pet>> vec{ new Cat(), new Dog() };
return vec;
}

int main()
{
std::vector<std::unique_ptr<Pet>> pets = make_pets();
std::cout << "Pets:\n";
for (const Pet *pPet : pets) std::cout << pPet->what() << '\n';
for (const Pet *pPet : pets) delete pPet;
}

输出:

Pets:
cat
dog

Live Demo on coliru

使用 new 创建实例导致必须使用 delete 显式销毁这些实例.只是清除 std::vector<Pet*> pets相反,会留下未删除和丢失的实例——内存泄漏。


std::unique_ptr的用法(由 @user4581301 推荐)有点棘手。因为 std::unique_ptr 的实例是唯一拥有/持有指针的人,它可能不会被复制或分配,而只是被移动。经过一些摆弄后,我得到了 coliru 上的 mcve:

#include <iostream>
#include <memory>
#include <vector>

struct Pet {
virtual ~Pet() = default;
virtual const char* what() const = 0;
};

struct Cat: public Pet {
virtual const char* what() const override { return "cat"; }
};

struct Dog: public Pet {
virtual const char* what() const override { return "dog"; }
};

std::vector<std::unique_ptr<Pet>> make_pets()
{
std::vector<std::unique_ptr<Pet>> vec;
vec.emplace_back(std::make_unique<Cat>());
vec.emplace_back(std::make_unique<Dog>());
return vec;
}

int main()
{
std::vector<std::unique_ptr<Pet>> pets = make_pets();
std::cout << "Pets:\n";
for (const std::unique_ptr<Pet> &pPet : pets) std::cout << pPet->what() << '\n';
}

输出:

Pets:
cat
dog

Live Demo on coliru

销毁Pet在这种情况下,实例不是问题。 std::unique_ptr<Pet>授予指针本身删除后立即删除指针对象。

关于c++ - 错误 : no matching function for call to 'std::vector<Pet*>::vector(<brace-enclosed initializer list>)' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58926355/

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