我目前正在編寫一些遊戲代碼,其中一部分涉及創建遊戲中迄今爲止發生的操作的歷史記錄。該歷史存儲在state_pair_t
的動作對(action_t
's)的向量中,以及在動作完成後指向結果遊戲狀態的指針。現在我有一個函數,從最近的時間點開始查看歷史記錄,並向後迭代,直到找到某種類型的操作,然後返回對該操作的引用。現在我們決定,如果沒有找到任何操作,使用boost可選返回no_action
,並使用boost::optional
來處理這些函數,這些函數應該返回一個值,但可能沒有返回值。當我其實是想實現這一點,我碰到一個錯誤,我不明白:boost ::可選參考與boost :: variant類型
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 error C2664: 'boost::optional<T>::optional(boost::none_t)' : cannot convert parameter 1 from 'const action_t' to 'boost::none_t'
現在,如果我改變這個稍微:
if(!(is_action_type<A>(rcit->first))){
return boost::optional<action_t>(rcit->first);
}
我得到另一個錯誤:
error C2664: 'boost::optional<T>::optional(boost::none_t)' : cannot convert parameter 1 from 'boost::optional<T>' to 'boost::none_t'
我不確定這些錯誤中的哪一個都試圖告訴我這裏。我想在這裏做什麼不是一個好主意,boost::optional
?它甚至有可能嗎?
感謝這個答案,這似乎幾乎使它編譯正確,但現在我遇到了一個問題,其中編譯器抱怨'T = opt_action_ref_t'不是'action_t'變體類型的一部分。我覺得這有點奇怪,因爲我不希望'opt_action_ref_t'成爲變體中的一個類型。我在這裏顯然做錯了嗎? – shuttle87 2013-04-07 19:20:10