gpt4 book ai didi

c++ - 试图在列表上 push_back。 C++

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

当我尝试在列表中使用 push_back 方法时遇到编译器错误。

这是我的代码:

// Point iterator to the proper warehouse.
set<cs3505::warehouse>::iterator curr_warehouse = warehouses.find(warehouse);

// Insert new inventory_item into the warehouse.

// Create a copy of today's date, and increment it.
cs3505::date exp_date = current_date;
exp_date.increment(curr_food.get_shelf_life());

// Create a new inventory item.
cs3505::inventory_item new_item(curr_food, exp_date);
// Set the quantity of the new item.
new_item.set_quantity(qty);

// Now insert the item.
// Adding new items being at the end ensures the oldest items will be at the
// beginning of the list.
(*curr_warehouse).inventory.push_back(new_item);

编译器错误:

report.cc:134: error: passing ‘const std::list >’ as ‘this’ argument of ‘void std::list<_Tp, _Alloc>::push_back(const _Tp&) [with _Tp = cs3505::inventory_item, _Alloc = std::allocator]’ discards qualifiers

我的代码的最后一行是第 134 行。感谢您的帮助。几个小时以来,我一直在努力解决这个问题。

这是 inventory_item 的定义:

/*
* An inventory item which includes a food item, an expiration date,
* and quantity.
*/

#include "inventory_item.h"
#include "date.h"
#include "food_item.h"

namespace cs3505
{
// inventory_item definitions

/*
* Constructs an inventory item.
*/
inventory_item::inventory_item(food_item &item, date &exp_date)
{
this->item = item;
this->expiration_date = exp_date;
this->quantity = 0;
}

/*
* Destructs a food item.
*/
inventory_item::~inventory_item() { }

/*
* Returns this inventory item's food item.
*/
food_item inventory_item::get_food_item()
{
return this->item;
}

/*
* Returns the expiration date for this inventory item.
*/
date inventory_item::get_exp_date()
{
return this->expiration_date;
}

/*
* Returns the quantity of this inventory item.
*/
int inventory_item::get_quantity()
{
return this->quantity;
}

/*
* Sets the quantity of this food item.
*/
void inventory_item::set_quantity(int change)
{
this->quantity = change;
}
}

我还有一个包含列表的自定义仓库类。我正在尝试向该列表中添加库存项目。

最佳答案

这里的错误是因为您忽略了 const 限定符。这是因为集合返回的迭代器必须是常量。存在此限制是因为集合中的所有元素都必须是唯一的;通过迭代器更改集合中元素的值可能会破坏此契约。

我无法随手找到确切的引用(SGI 对 std::set 的引用没有提到这一点),所以我将链接到另一个 Stackoverflow 帖子,解释了这一点: C++ STL set update is tedious: I can't change an element in place

编辑:找到了。

std::setSimple Associative Container 的一种,这意味着值与键相同。以下段落对此进行了总结:

The types X::iterator and X::const_iterator must be the same type. That is, a Simple Associative Container does not provide mutable iterators.

这确实意味着我的第一段在技术上略有错误。这并不是要确保您不会将集合的元素从其下方更改为相同的值,而只是设计使然。它实际上是基础上“键是不可变的”不变性的副作用 Associative Container概念。

尽管如此,我还是将其保留在那里,以免对其进行重大修改。

关于c++ - 试图在列表上 push_back。 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14657788/

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