2013-04-05 2 views
3

현재 게임에 대한 코드를 작성 중입니다. 그 중 일부는 게임에서 지금까지 수행 된 작업 내역을 작성하는 것과 관련이 있습니다. 이 히스토리는 state_pair_t 작업 쌍 (action_t ')의 벡터와 작업이 이루어진 후 결과 gamestate에 대한 포인터에 저장됩니다. 이제는 가장 최근의 시점에서 시작하는 히스토리를 살펴보고 특정 유형의 동작이 발견 될 때까지 반복적으로 반복 한 다음 그에 대한 참조를 반환하는 몇 가지 기능이 있습니다. 이제 boost 옵션을 사용하여 아무런 작업도 발견되지 않으면 no_action을 반환하고 boost::optional을 사용하여 값을 반환해야하지만 반환 할 값이 없을 수있는 함수를 처리하는 것이 좋은 설계 작업이라고 판단했습니다. 실제로 내가 오류로 실행이를 구현하기 위해 노력했습니다 때 그 이해가 안 : 나는 약간 변경할 경우 지금boost :: variant 유형의 boost :: optional 참조

Error error C2664: 'boost::optional<T>::optional(boost::none_t)' : cannot convert parameter 1 from 'const action_t' to 'boost::none_t' 

:

typedef boost::variant< 
    A, 
    B, 
    B 
> action_t; 

typedef boost::optional< action_t& > opt_action_ref_t; 

const opt_action_ref_t no_action = opt_action_ref_t(); 

/*! A state pair is the combination of a particular action and the resulting game state */ 
typedef std::pair< const action_t, game_state_ptr > state_pair_t; 

opt_action_ref_t get_last_non_A_action() const{ 
    std::vector<state_pair_t>::const_reverse_iterator rcit; 
    for(rcit = m_states.rbegin(); m_states.rend() != rcit ; ++rcit){ 
     if(!(is_action_type<A>(rcit->first))){ 
      return rcit->first; \\error at compile time 
     } 
    } 

    return no_action; 
} 

이제이 컴파일 오류를 제공합니다 :

error C2664: 'boost::optional<T>::optional(boost::none_t)' : cannot convert parameter 1 from 'boost::optional<T>' to 'boost::none_t' 
:

if(!(is_action_type<A>(rcit->first))){ 
     return boost::optional<action_t>(rcit->first); 
    } 

나는 또 다른 오류 0

나는이 오류 중 어느 것이 나에게 여기에서 말하려고하는지 잘 모르겠다. 내가 여기서하려고하는 것은 boost::optional으로 좋은 아이디어가 아니니? 심지어 가능할까요?

답변

2

선택적 참조 자체는 좋은 아이디어입니다. 특히 recent paper n3527에서 언급되었으므로 C++ 14에서 라이브러리 구성 요소로 표준화해야합니다. 그들은 Boost.Optional에서 지원됩니다.

코드에 문제가 있습니다. const가 아닌 선택적 참조를 const 값과 바인딩하려고합니다. boost::optional< action_t& >boost::optional< const action_t& >으로 변경하면 정상적으로 컴파일되어야합니다.

+0

이 답변을 주셔서 감사합니다. 거의 올바르게 컴파일되지만, 이제 컴파일러가'T = opt_action_ref_t'가'action_t' 변형 유형의 일부가 아니라는 문구가 나옵니다. 나는'opt_action_ref_t'가 변형의 유형이되기를 원하지 않기 때문에 조금 이상합니다. 내가 여기서 분명히 잘못하고있는 것이 있습니까? – shuttle87

관련 문제