推 scwg:word_map 是 const 或是個 const instance 的 field 嗎? 11/19 10:11
→ scwg:error message 是什麼? 程式上下文? 11/19 10:13
word_map declare不是const 他是自定義class內的private member class名TextQuery
主要問題就是下面這個compile不成 但如果那個return換成下面那個return 就可以
set <TextQuery::line_no> TextQuery:: run_query(const string &qword) const
{
if (word_map.find(qword) == word_map.end())
return std::set<line_no>();
return word_map[qword];
//return word_map.find(qword)->second;
}
compiler是icc 出來的訊息很繁雜... 類似這樣:
error: passing â€o> TextQuery:: run_query(const std::stringstd::allocator<
unsigned int>, std::allocator<long unsigned int> >, std::less<std::basic_string<char, std::char_traits<char>, stst
std::basic_string<char, std::char_traits<char>, std::allocator<char> >....(後
面太長了)
後來把map的value中的set改成vector也有一樣的問題...不知道是哪邊概念錯誤
※ 編輯: DreamLoser 來自: 111.249.91.172 (11/19 10:22)
→ shadow0326:map::operator[] 並非const method 11/19 10:30
→ shadow0326:所以不能在你的const method裡呼叫他 11/19 10:31
→ shadow0326:另外,return一份copy真的是你要的嗎 11/19 10:34
你好 感謝你的回答 我不太懂所謂的const method是什麼意思 不過我猜你的意思應該是
在呼叫word_map[qword]的時候 compiler會把這個判斷為"有可能為左值"之可能(
也就是word_map[qword] = 1讓他改變而非const) 因此compiler不給我過?
※ 編輯: DreamLoser 來自: 111.249.91.172 (11/19 10:51)
推 shadow0326:你的function宣告,最後面不是有個const嗎 11/19 10:56
→ shadow0326:那表示這是個const method,不可改變物件成員的值 11/19 10:57
→ shadow0326:同時也不可呼叫他成員的non-const method 11/19 10:57
→ shadow0326:而C++標準裡面map::operator[]就是個non-const method 11/19 10:58
感謝 剛剛把function宣告成non-const type 果然可以過了
推 NIKE74731:除非有特殊需求 否則使用[]是一個不好的方法 個人覺得 11/19 11:03
→ NIKE74731:而且return word_map.find(qword)->second;也頗危險 11/19 11:05
的確蠻危險的 因為iterator不是const 課本是把obj.find(qword)先宣告成
const_iterator 所以課本的是沒什麼問題 我只是貼上我自己的版本 所以iterator如果
未來程式沒注意這點 很可能會修改到它...
※ 編輯: DreamLoser 來自: 111.249.91.172 (11/19 11:10)
推 NIKE74731:這跟它是不是const-iterator應該無關 重點是如果你find 11/19 11:14
→ NIKE74731:的結果是word_map.end() 那你就挫賽了 11/19 11:14
→ DreamLoser:這個倒是還ok 因為上面有個if把這個可能性清掉了 11/19 11:25