0

私は

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

4 に答える 4

1

のcosntructorを作成することで回避できます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, "");
于 2013-02-02T23:44:33.457 に答える
1

@billzのソリューションの代わりに、オブジェクトを作成し、2つの別々のステップでマップに挿入することもできます。

OpDesc od = { "StoreOp",2,false,false,"","",false,"" };
opDesc["StoreOp"] = od;
于 2013-02-02T23:45:36.673 に答える
1

構文は有効なC++11ですが(Uniform Initializationを参照)、VS10はそれをサポートしていません。VS12にのみ追加されました(VS2012のC ++機能を参照)。1つのオプションは、コンパイラを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, "");
于 2013-02-02T23:45:46.463 に答える
0

別のコンパイラを使用できます。ソースコードはclang++V3.3およびgcc4.7.2で動作します。

于 2013-02-02T23:48:00.527 に答える