0

次のマップをグローバルに宣言し、グローバルに設定しようとしています。

   1: typedef std::map<unsigned short,std::pair<char,std::string>> DeviceTypeList;
   2: DeviceTypeList g_DeviceTypeList;
   3: g_DeviceTypeList.insert( std::make_pair ((unsigned short)SINGLE_CELL_CAMERA,
   std::make_pair('B',"Single Cell Camera")));

エラー C2143のようなエラーが表示されます: 構文エラー: ';' がありません 前 '。' line2で。

1 私は何か間違ったことをしていますか
2. マップをグローバルに初期化できないのはなぜですか。

4

2 に答える 2

4

コンパイラはおそらく>>1行目で混乱しています(シフト演算子のように見えるため)。そこにスペースを挿入してみてください:

typedef std::map<unsigned short,std::pair<char,std::string> > DeviceTypeList;

[アップデート]

これが実際に問題を解決しない理由については、Vlad Lazarenko のコメントを参照してください。最も簡単な修正は、このからくりをオブジェクトにラップし、コンストラクターで初期化してから、グローバル スコープで宣言することです。(しかし、そもそもグローバルは悪であるため、それを回避できる場合はそうではありません...)

于 2011-06-02T03:17:27.403 に答える
2

グローバルスコープに含めることができるのは宣言と定義のみであり、map :: insert()の呼び出しはそれらの1つではありません。

テンプレートで使用>>しているので、コンパイラはC++0xをサポートするのに十分新しいものでなければなりません。

次に、C++0x初期化構文を試してください。

typedef std::map<unsigned short, std::pair<char,std::string>> DeviceTypeList;
DeviceTypeList g_DeviceTypeList = {
              {(unsigned short)SINGLE_CELL_CAMERA, {'B',"Single Cell Camera"}}
           };

テスト:https ://ideone.com/t4MAZ

診断では、2010年の時点でC ++ 0x初期化子がないMSVSであることが示されているため、代わりにブースト初期化子構文を試してください。

typedef std::map<unsigned short, std::pair<char,std::string> > DeviceTypeList;
DeviceTypeList g_DeviceTypeList =
           boost::assign::map_list_of((unsigned short)SINGLE_CELL_CAMERA,
                                       std::make_pair('B',"Single Cell Camera"));

テスト:https ://ideone.com/KB0vV

于 2011-06-02T03:25:55.793 に答える