回答
有一個問題,因爲它是一個宏,因此不能處理包含逗號的類型(預處理器不知道模板)。
您也可以在循環之前聲明該變量,請參閱documentation。
std::map<int, double> my_map;
//1)
typedef std::pair<int, double> MyPair;
BOOST_FOREACH(MyPair p, my_map) { ... }
//2)
std::pair<int, double> p;
BOOST_FOREACH(p, my_map) { ... }
編輯:
沒有與特別std::map
進一步複雜化:在value_type
不是std::pair<Key, Value>
,但std::pair<const Key, Value>
。
因此,如果您使用的typedef去,更合適的方式(也是唯一的方式,如果你想使用foreach循環一個參考)是使用
typedef std::pair<const int, double> MyPair;
//or
typedef std::map<int, double>::value_type MyPair;
BOOST_FOREACH(MyPair& ref, my_map) { ... }
然而,韓元如果你想使用一個在循環之前聲明的變量,你就不會工作,因爲你以後不能指定std::pair<const int, double>
實例(不能指定給const字段),在這種情況下,你只能使用pair<int, double>
作爲提升的手動顯示。
BOOST_FOREACH_PAIR
的是,在我們的經驗行之有效的另一種選擇:
如果你需要遍歷的地圖,最簡單的方法是使用元組,因爲得到正確的鍵入以typedef,很麻煩。下面是你如何使用元組:
std::map<int, double> my_map;
int key;
double value;
BOOST_FOREACH(boost::tie(key, value), my_map) { ... }
只是一個說明,逗號將在這裏工作,因爲括號放在鍵和值周圍。預處理器只能理解逗號和括號(並且c99也要求它理解引號)。所以,它不能解析std::pair<int, double>
中的<>
。但是,我們可以使用括號來幫助預處理器。例如,如果我們有一個返回一個被稱爲像這樣的集裝箱AA功能:
BOOST_FOREACH(int i, foo<int, int>()) { ... } //This won't compile
因此,我們可以把括號圍繞一個表達式,它會幫助預處理器:
BOOST_FOREACH(int i, (foo<int, int>())) { ... } //This will compile
然而,在地圖的情況下,我們不能在括號內放置括號(因爲它不是表達式)。所以這是行不通的:
BOOST_FOREACH((std::pair<int, double> p), my_map) { ... } //This won't work
因爲它會被轉化成這樣的事情(std::pair<int, double> p) = *it
,這當然是不正確的C++。但使用領帶將工作:
BOOST_FOREACH(tie(key, value), my_map) { ... } //This will work
我們只需要聲明循環外的鍵和值(如上所示)。另外,它可以使循環具有更多有意義的名稱。您可以寫key
而不是p.first
和value
而不是p.second
。
這可能是如此簡單:
BOOST_FOREACH(auto& p, my_map) { ... }
使用C++ 11的標準,汽車就像是在C#變種,它會做
BOOST_FOREACH(std::pair<int, double>& p, my_map) { ... }
- 1. 模板和typedef的錯誤
- 2. typedef和模板專業化
- 3. C++ typedef和模板語法?
- 4. C++模板的typedef
- 5. 模板類的typedef
- 6. C++模板的typedef
- 7. 模板的typedef類中不起作用
- 8. 的typedef模板類錯誤
- 9. 的typedef嵌套模板類
- 10. typedef模板類的聲明
- 11. 的typedef使用模板
- 12. 用的typedef模板函數
- 13. 程序輸出與模板和typedef類
- 14. C++ extern模板實例化和typedef(gcc)
- 15. 在模板中使用typedef和typename
- 16. 帶有typedef返回值的模板成員函數
- 17. typedef到模板類型
- 18. 使用typedef for unique_ptr模板
- 19. typedef模板類與Doxygen(C++)
- 20. C帶的typedef
- 21. 創建不帶interop和excel的模板帶或不帶行和列寬
- 22. 使用模板暴露私有的typedef,
- 23. typedef模板,這是可能的嗎?
- 24. 與類模板的typedef參數
- 25. 類模板中的Typedef評估
- 26. 在模板類中使用模板化嵌套類的Typedef
- 27. 帶指針和數組的typedef結構
- 28. 模板的typedef接受指針const和非const功能
- 29. C++中的模板迭代器,解引用和typedef
- 30. Typedef模板類,但沒有指定模板參數
你或許應該作出這樣的:STD :: map :: value_type –
2009-11-11 08:59:01
也在C++ 11中; BOOST_FOREACH(auto&ref,my_map){...} – 2011-11-11 10:11:24