2013-08-16 39 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"), 

    // ... 
}; 
相关问题