2013-08-16 43 views
0
typedef std::map<int, const char*> error_code_tbl_t; 
typedef error_code_tbl_t::value_type error_code_entry_t; 
const error_code_entry_t error_code_tbl_[] = { 
    { ERR_OK    , "ERR_OK" }, 
    { ERR_RT_OUT_OF_MEMORY, "ERR_RT_OUT_OF_MEMORY" }, 
    // ... 
}; 
const error_code_tbl_t error_code_tbl(begin(error_code_tbl_) 
            , end (error_code_tbl_)); 

const char* err2msg(int code) 
{ 
    const error_code_tbl_t::const_iterator it = error_code_tbl.find(code); 
    if(it == error_code_tbl.end()) 
     return "unknown"; 
    return it->second; 
} 

上面的代碼所示拋出「錯誤:各地標初始化括號類型âconsterror_code_entry_tâ」誰能幫我解決這個問題嗎?括號爲const類型GCC

回答

1

你似乎有一個C++編譯器03,因爲這應該編譯C++ 11。 由於error_code_entry_t是您的地圖的value_type,它實際上是一個std::pair<const in, const char*>(是的,鍵類型的常量是正確的)。這不是一個聚合,所以你不能像這樣初始化它。要解決手頭上的錯誤,你可以嘗試以下方法:

const error_code_entry_t error_code_tbl_[] = { 
    error_code_entry_t(ERR_OK    , "ERR_OK"), 
    error_code_entry_t(ERR_RT_OUT_OF_MEMORY, "ERR_RT_OUT_OF_MEMORY"), 
    // ... 
}; 

但是既然你想將它們放到一個地圖反正,我會考慮boost.assign:

#include <boost/assign/list_of.hpp> 

const error_code_tbl_t error_code_tbl = boost::assign::map_list_of 
    (ERR_OK    , "ERR_OK") 
    (ERR_RT_OUT_OF_MEMORY, "ERR_RT_OUT_OF_MEMORY") 
; 
1

在C++ 11中,這很好,儘管可以通過直接初始化映射而不是使用數組來簡化它。

如果您陷入過去,那麼您無法從支撐初始化程序列表初始化value_type專用std::pair專用化的別名;儘管一些編譯器可能會將其作爲非標準擴展。相反,你需要:

const error_code_entry_t error_code_tbl_[] = { 
    // Either like this 
    error_code_entry_t(ERR_OK, "ERR_OK"), 

    // Or like this 
    std::make_pair(ERR_RT_OUT_OF_MEMORY, "ERR_RT_OUT_OF_MEMORY"), 

    // ... 
}; 
相關問題