2

我刚刚注意到我无法在 boost 多索引容器元素中进行更改。这是真的?(基于以下简化代码)查看“更新”功能:

#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);
}

无需通过整个程序。请注意,在更新方法中,我收到此错误: multiIndex$ c++ exp2.cpp exp2.cpp: In member function 'void sim_mob::Phase::update(double)': exp2.cpp:69:29: error : 在只读对象中分配成员 'sim_mob::linkToLink::currColor'

我刚刚在boost 教程 中读到迭代器只授予 const 访问权限。我该如何解决这个问题?谢谢您的帮助

4

1 回答 1

9

在多索引容器中更改元素的三种不同方式。您可以使用links_map_.replace(iterator, new_value)新元素替换现有元素。您可以使用links_map_.modify(iterator, unaryFunctionObject)修改器对象来更改元素。最后,如果成员变量不属于任何索引,您可以将其声明为mutable并直接更改它。在您的示例中,后者应该可以正常工作。

对于其他两种方式,请查看成员函数的规范和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 回答