2

ブーストマルチインデックスコンテナ要素を変更できないことに気づきました。これは本当ですか?(次の簡略化されたコードに基づく)「更新」関数を見てください。

#include <boost/multi_index_container.hpp>
#include <boost/multi_index/ordered_index.hpp>
#include <boost/multi_index/random_access_index.hpp>
#include <boost/multi_index/identity.hpp>
#include <boost/multi_index/member.hpp>
namespace sim_mob
{
enum TrafficColor
{
    Red =1,             ///< Stop, do not go beyond the stop line.
    Amber = 2,          ///< Slow-down, prepare to stop before the stop line.
    Green = 3,          ///< Proceed either in the forward, left, or right direction.
    FlashingRed = 4,    ///future use
    FlashingAmber = 5,  ///future use
    FlashingGreen = 6   ///future use
};
//Forward declarations
class Link
{
public:
    int aa;
};

//////////////some bundling ///////////////////
using namespace ::boost;
using namespace ::boost::multi_index;

typedef struct
{
    sim_mob::Link *LinkTo;
    sim_mob::Link *LinkFrom;
//  ColorSequence colorSequence;
    TrafficColor currColor;
} linkToLink;


typedef multi_index_container<
    linkToLink,
    indexed_by<                                                                    // index
        random_access<>,//0
        ordered_non_unique< member<linkToLink,sim_mob::Link *, &linkToLink::LinkTo> >,  // 1
        ordered_non_unique< member<linkToLink,sim_mob::Link *, &linkToLink::LinkFrom> >  // 2
    >
> links_map;
class Phase
{
public:
    typedef links_map::nth_index_iterator<1>::type LinkTo_Iterator;
    Phase(double CycleLenght,std::size_t start, std::size_t percent): cycleLength(CycleLenght),startPecentage(start),percentage(percent){
    };

    void update(double lapse)
    {
        links_map_[0].currColor = Red;
    }

    std::string name;
private:
    sim_mob::links_map links_map_;

};
}//namespace

int main()
{
    sim_mob::Phase F(100,70,30);
}

プログラム全体を実行する必要はありません。updateメソッドで、次のエラーが発生することに注意してください。multiIndex $ c ++ exp2.cpp exp2.cpp:メンバー関数'void sim_mob :: Phase :: update(double)':exp2.cpp:69:29:エラー:読み取り専用オブジェクトでのメンバー'sim_mob :: linkToLink::currColor'の割り当て

ブーストチュートリアル で、イテレータはconstアクセスのみを許可することを読みました。この問題を回避するにはどうすればよいですか?ご協力ありがとうございました

4

1 に答える 1

9

マルチインデックスコンテナの要素を変更する3つの異なる方法。を使用links_map_.replace(iterator, new_value)して、既存の要素を新しい要素に置き換えることができます。links_map_.modify(iterator, unaryFunctionObject)モディファイヤオブジェクトを使用して要素を変更するために使用できます。そして最後に、メンバー変数がどのインデックスにも含まれていない場合は、それをとして宣言しmutableて直接変更できます。あなたの例では、後者はうまくいくはずです。

他の2つの方法については、メンバー関数の仕様とreplaceBoost.MultiIndexドキュメントmodifyを参照してください。

編集:特定のケースでは、のアプローチは次のmutableようになります。

struct linkToLink
{
    sim_mob::Link* LinkTo;
    sim_mob::Link* LinkFrom;
    // simplify write operations to this variable if used in a multi-index
    // container - bypassing the const-ness. This is possible, because the
    // variable is not part of any index.
    mutable TrafficColor currColor;
};
于 2012-05-09T06:43:43.027 に答える