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;
}
код, показанный выше, выдает «error: скобки вокруг скалярного инициализатора для типа« error_code_entry_tâ ». Может кто-нибудь помочь мне исправить это, пожалуйста?
Похоже, у вас есть компилятор C ++ 03, поскольку он должен компилироваться в C ++ 11.
поскольку error_code_entry_t
это value_type
вашей карты, это на самом деле std::pair<const in, const char*>
(Да, const для типа ключа правильный). Это не агрегат, поэтому вы не можете инициализировать его таким образом. Чтобы исправить ошибку под рукой, вы можете попробовать следующее:
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")
;
В 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"),
// ...
};