使用字符串键初始化结构图

时间:2013-02-02 23:34:04

标签: c++ map static struct init

我有一个

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 : '{'

如何解决?

4 个答案:

答案 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。