Инициировать карту структур со строковым ключом

у меня есть

struct OpDesc {
std::string  OPName;
size_t       OPArgsMin;
bool         IsVaribaleArgsNum;
bool         IsOPChange;
std::string  ChangeNodeOP;
std::string  ChangeNodeLabel;
bool         IsOPDelete;
const char*  ErrMsg;
};

И хочу, чтобы начать std::map<string, OpDesc>,

Я попытался сделать это так:

typedef std::map<std::string,struct OpDesc> OpDescMap;
OpDescMap opDesc;
opDesc["StoreOp"] = {"StoreOp",2,false,false,"","",false,""};
/// etc.

Я не могу скомпилировать это с VS10. Я получил : error C2059: syntax error : '{'

Как это можно решить?

0

Решение

Ваш синтаксис действителен C ++ 11 (см. Единая инициализация), однако, VS10 не поддерживает его. Он был добавлен только к VS12 (см. Особенности C ++ в VS2012). Один из вариантов — обновить ваш компилятор, чтобы он лучше соответствовал C ++ 11.

Если вы не можете выполнить обновление, вам придется вернуться к синтаксису C ++ 03. Вы можете использовать промежуточную переменную:

OpDesc op = {"StoreOp", 2, false, false, "", "", false, ""};
opDesc[op.OPName] = op;

Или добавьте конструктор в вашу структуру:

struct OpDesc {
// ... all fields
OpDesc(std::string const& opName, size_t opArgsMin, bool isVariableArgsNum,
bool isOpChange, std::string const& changeNameOp,
std::string const& changeNodeLabel, bool isOpDelete,
char const* errMsg)
: OPName(opName), OPArgsMin(opArgsMin), IsVariableArgsNum(isVariableArgsNum),
IsOpChange(isOpChange), ChangeNameOp(changeNameOp),
ChangeNodeLabel(changeNodeLabel), IsOpDelete(isOpDelete),
ErrMsg(errMsg) {}
};

opDesc["StoreOp"] = OpDesc("StoreOp", 2, false, false, "", "", false, "");
1

Другие решения

Может обойтись путем создания contructor для OpDesc

OpDesc(const std::string&  oPName="StoreOp",
size_t oPArgsMin = 0,
bool  isVaribaleArgsNum = false,
bool  isOPChange=false,
const std::string&  changeNodeOP = "",
const std::string&  changeNodeLabel = "",
bool  isOPDelete = false,
const char*  errMsg= "" )
:OPName(oPName),
OPArgsMin(oPArgsMin),
IsVaribaleArgsNum(isVaribaleArgsNum),
IsOPChange(isOPChange),
ChangeNodeOP(changeNodeOP),
ChangeNodeLabel(changeNodeLabel),
IsOPDelete(isOPDelete),
ErrMsg(errMsg)
{
}

OpDescMap opDesc;
opDesc["StoreOp"] = OpDesc("StoreOp", 2, false, false, "", "", false, "");
1

Альтернативой решению @ billz является создание объекта и его вставка в карту в два отдельных этапа:

OpDesc od = { "StoreOp",2,false,false,"","",false,"" };
opDesc["StoreOp"] = od;
1

Вы можете использовать другой компилятор: ваш исходный код работает с clang ++ V 3.3 и gcc 4.7.2.

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