скобки вокруг скалярного инициализатора для типа const GCC

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â ». Может кто-нибудь помочь мне исправить это, пожалуйста?

0

Решение

Похоже, у вас есть компилятор 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")
;
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"),

// ...
};
1

По вопросам рекламы [email protected]