我有一个
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 :(得分:1)
可以通过为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 :(得分:1)
@ billz解决方案的替代方案是构造对象并通过两个单独的步骤将其插入到地图中:
OpDesc od = { "StoreOp",2,false,false,"","",false,"" };
opDesc["StoreOp"] = od;
答案 2 :(得分:1)
您的语法是有效的C ++ 11(请参阅Uniform Initialization),但是,VS10不支持它。它只被添加到VS12(见C++ features in 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, "");
答案 3 :(得分:0)
您可以使用其他编译器:您的源代码适用于clang ++ V 3.3和gcc 4.7.2。