2012-05-09 3 views
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); 
} 

전체 프로그램을 거칠 필요가 없습니다. 그냥 업데이트 메서드에서이 오류가 발생합니다. multiIndex $ C++ exp2.cpp exp2.cpp : 멤버 함수 'void sim_mob :: Phase :: update (double)': exp2.cpp : 69 : 29 : error : 읽기 전용 객체에서 'sim_mob :: linkToLink :: currColor'멤버를 할당하십시오.

반복자가 const 액세스 만 허용한다는 것을 단지 boost tutorial으로 읽었습니다. 이 문제를 어떻게 해결할 수 있습니까? 도움을 주셔서 감사합니다.

답변

7

다중 색인 컨테이너에서 세 가지 다른 방법으로 요소를 변경할 수 있습니다. links_map_.replace(iterator, new_value)을 사용하여 기존 요소를 새 요소로 바꿀 수 있습니다. links_map_.modify(iterator, unaryFunctionObject)을 사용하여 수정 자 개체를 사용하여 요소를 변경할 수 있습니다. 마지막으로 멤버 변수가 어떤 인덱스에도 속하지 않으면 mutable으로 선언하고 직접 변경할 수 있습니다. 예를 들어, 후자는 잘 작동합니다.

다른 두 가지 방법은 replacemodify의 사양을 Boost.MultiIndex Documentation에 살펴보십시오.

편집 : 특정 경우는, 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; 
}; 
+0

감사합니다. 내 코드 예제를 수정하여 필요한 부분과 방법을 표시 할 수 있다면 더 많은 정보와 도움이 될 것입니다 (특히 나에게). 가변적 인 솔루션으로 충분할 것입니다. 고마워, 안부. – rahman