2011-05-25 64 views
1

我從boost :: unordered_map庫(v1.45.0)中得到了奇怪的行爲。Boost unordered_map - 錯誤或不正確的用法?

在我的班級我創建一個對象:

boost::unordered_map<uint16, MyStruct *> bufferStructMap; 

然後我初始化它在構造函數初始化列表:

MyClass::MyClass() : bufferStructMap() { .... } 

然後我嘗試使用方法「at拉出來的東西它「(參見API中的鏈接):

const uint16 bufferNumber = 1; 
try { 

    MyStruct * ptr = (this->bufferStructMap.at(bufferNumber)); 
} 
catch (std::out_of_range & e){ 

    //deal with exception 
} 

當地圖爲空時,ap摺疊放棄與調用「bufferStructMap.at(...)」,即使API說唯一可以拋出的異常是一個std :: out_of_range。

任何人都可以檢測到我的代碼有問題,或者這是一個提升錯誤?

謝謝!

+0

你知道你實際得到什麼類型的異常嗎?偶然得到了「bad_cast」嗎? – 2011-05-25 15:06:18

+1

爲什麼static_cast? – 2011-05-25 15:13:13

+0

@尼爾:我想案子是沒有必要的,我只是爲了確保我確定的類型是正確的。但我肯定可以刪除它。好的,刪除了演員。問題仍然存在.. – 2011-05-25 15:15:04

回答

1

Mark B可能是對的。如果不是,它看起來像是Boost中的一個bug。

儘管...因爲std :: tr1 :: unordered_map(和C++ 0x版本?不確定)不提供at(),您可能只想使用find()。

// Save typing, allow easy change to std::unordered_map someday 
typedef boost::unordered_map<uint16, MyStruct *> map_t; 

map_t bufferStructMap; 

...

map_t::const_iterator p = bufferStructMap.find(bufferNumber); 
if (p == bufferStructMap.end()) 
    // not found 
else 
    // p->second is your value 
+0

你說得對,這比使用例外來試圖控制正常的程序流程要聰明得多。畢竟,例外是出於特殊情況。 – 2011-05-25 19:49:03

1

我寧願趕上爲const參考

catch (std::out_of_range const& e){ 
1

此代碼有沒有問題:

#include "boost/unordered_map.hpp" 
#include <exception> 
#include <iostream> 

struct MyStruct {}; 
boost::unordered_map<int, MyStruct *> bufferStructMap; 

int main() { 
    try { 
     MyStruct * ptr = (bufferStructMap.at(1)); 
    } 
    catch (std::out_of_range & e){ 
     std::cout << "caught\n"; 
    } 
} 

所以我想你的問題是其他地方 - 你需要發佈更多的代碼。

1

而是抓住std::out_of_range,儘量std::exception。然後,您可以使用what成員獲取有關該例外的更多信息。