试图在列表上推送back_back。 C ++

时间:2013-02-02 01:47:19

标签: c++

当我尝试在列表中使用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:错误:将'const std :: list&gt;'作为'void'参数传递给'void std :: list&lt; _Tp,_Alloc&gt; :: push_back(const _Tp&amp;)[with _Tp = cs3505 :: inventory_item,_Alloc = std :: allocator]'丢弃限定符

我的代码的最后一行是第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;
}
}

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

1 个答案:

答案 0 :(得分:2)

此处的错误是因为您忽略了const限定符。这是因为集合返回的迭代器必须是const。这种限制已经到位,因为集合中的所有元素必须是唯一的;通过迭代器更改集合中元素的值可能会破坏此契约。

我找不到准确的引用(并且SGI对std::set的引用没有提到这一点),所以我将链接到另一个Stackoverflow帖子,解释为:C++ STL set update is tedious: I can't change an element in place < / p> 编辑:发现它。

std::set是一种Simple Associative Container,意味着值与键相同。以下段落总结了这一点:

  

X :: iterator和X :: const_iterator类型必须是同一类型。也就是说,Simple Associative Container不提供可变迭代器。

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

尽管如此,我还是会把它留在那里,不要把它作为主要的编辑。