у меня есть
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 : '{'
Как это можно решить?
Ваш синтаксис действителен 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, "");
Может обойтись путем создания 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, "");
Альтернативой решению @ billz является создание объекта и его вставка в карту в два отдельных этапа:
OpDesc od = { "StoreOp",2,false,false,"","",false,"" };
opDesc["StoreOp"] = od;
Вы можете использовать другой компилятор: ваш исходный код работает с clang ++ V 3.3 и gcc 4.7.2.