0

リストで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>'を'this'引数として'voidstd :: list <_Tp、_Alloc> :: push_back(const _Tp&)[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;
}
}

リストを持つカスタムウェアハウスクラスもあります。そのリストに在庫アイテムを追加しようとしています。

4

1 に答える 1

2

ここでのエラーは、const修飾子を無視しているためです。これは、セットによって返されるイテレータがconstでなければならないためです。セット内のすべての要素は一意である必要があるため、この制限が適用されます。イテレータを介してセット内の要素の値を変更すると、この契約が破られる可能性があります。

正確なリファレンスをすぐに見つけることができないので(そしてSGIのリファレンスでstd::setはこれについて言及していません)、代わりに別のStackoverflow投稿にリンクしてこれを説明します:C ++ STLセットの更新は面倒です:要素を変更できません所定の位置に

編集:それを見つけました。

std::setSimpleAssociativeContainerの一種であり、値がキーと同じであることを意味します。次の段落でこれを要約します。

タイプX::iteratorとX::const_iteratorは同じタイプである必要があります。つまり、Simple Associative Containerは、可変イテレーターを提供しません。

これは、私の最初の段落が技術的に少し間違っていることを意味します。セットの要素をその下から同じ値に変更しないことを保証するのではなく、単に設計によるものです。これは、実際には、基本的な連想コンテナの概念に対する「キーは不変」不変の副作用です。

それにもかかわらず、これを大きな編集にしないために、そのままにしておきます。

于 2013-02-02T02:02:12.727 に答える