如何使用向量的 emplace_back 函数? [关闭]

Posted

技术标签:

【中文标题】如何使用向量的 emplace_back 函数? [关闭]【英文标题】:How do I use the emplace_back function of a vector? [closed] 【发布时间】:2020-02-25 19:09:03 【问题描述】:

编辑:将其更改为只有一个问题,感谢您的反馈!

我有这个向量

vector<Artifact> art;


art.emplace_back("Ipad", 349.99);
art.emplace_back("Gameboy", 29.99);
art.emplace_back("Xbox", 229.99);
art.emplace_back("SamsungTV", 559.99);
art.emplace_back("AirCon", 319.99);

这些项目给我一个错误

C2661   'Artifact::Artifact': no overloaded function takes 2 arguments

我不明白为什么它会给我这个错误,我有一个带有 7 个参数的构造函数,但我只需要名称和价格来完成我想要做的事情。

编辑:这是最小的可重现示例:

class Item 
public:

virtual double GetTotalPrice();

;

//Class artifact now inherits Item
class Artifact : public Item

private:

string GUID;
string Name;
string Description;
string Category;
double Price;
double Discount;
enum DiscountType  Amount, Percentage ;
int Quantity;

public:
//Constructor
Artifact(string GUID, string Name, string Description, string Category, double Price, double Discount,  int Quantity)

    this->GUID = GUID;
    this->Name = Name;
    this->Description = Description;
    this->Category = Category;
    this->Price = Price;
    this->Discount = Discount;
    this->Quantity = Quantity;


//default constructor
Artifact();

void set_name(const string& name)

    Name = name;


void set_price(double price)

    if (Price > 0)
    
        Price = price;
    

    else cout << "Price cannot be negative!";


;

int main()



vector<Artifact> art;

art.emplace_back("Ipad", 349.99);
art.emplace_back("Gameboy", 29.99);
art.emplace_back("Xbox", 229.99);
art.emplace_back("SamsungTV", 559.99);
art.emplace_back("AirCon", 319.99);



return 0;


【问题讨论】:

排序问题见this。对于您的编译器错误,我们需要minimal reproducible example 你尝试了什么?您需要做的只是比较您想要排序的成员,但在交换元素时交换完整元素。抱歉,但不清楚是什么问题。也许如果您显示一些代码可以提供帮助。阅读minimal reproducible example 您提出的问题与快速排序无关。关于排序的一切都是上下文,但它与您描述的问题无关,除非您要问多个问题。为什么你认为 7 参数构造函数会在这里帮助你?你想在哪里构建一个有 7 个参数的对象? @FrançoisAndrieux 实际上是两个(不相关的)问题,两个问题的措辞都不是很好,一个是关于快速排序,另一个是关于需要 mcve 来回答的编译器错误 每个问题请专注于一个问题 【参考方案1】:

基本上,您得到的错误是因为您有两个构造函数(一个默认采用 0 参数,另一个采用 7 参数版本),但您只将两个值传递给 emplace_back。传递给emplace_back 的值被转发给Artifact 的构造函数。

有两种可能的解决方法。首先,是创建另一个只接受两个值的构造函数,如下所示:

Artifact(string Name, double Price) : Artifact("", Name, "", "", Price, 0., 0 ) 

或者,您可以修改现有的 7 参数构造函数以使用默认值

// note the reordering of parameters here
Artifact(string name, double Price, string GUID= "", 
         string Description = "", string Category = "", 
         double Discount = 0.0, int Quantity = 0)  … 

【讨论】:

感谢您的快速回复,您真的很有帮助。我按照你说的做了,我收到一个新错误 Error C2664 'Artifact::Artifact(Artifact &&)': cannot convert argument 2 from '_Ty' to 'std::string' 老实说,我不知道我哪里出错了。 这是一个移动构造函数,但我不确定您为什么会收到该错误。一个动作只有一个参数。

以上是关于如何使用向量的 emplace_back 函数? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

为啥我会使用 push_back 而不是 emplace_back?

std::vector emplace_back 可以从向量本身的元素复制构造吗?

带有智能指针的 C++11 向量

学习 emplace_back() 和 push_back 的区别 emplace_back效率高

[STL] vector中函数emplace_back的实现原理

默认构造函数阻止调用 emplace_back