• ベストアンサー

STLのmapについて

いつもお世話になっております。 今回はmapについてお聞きしたいです。 現在mapを使っていますが、mapを構造体に入れようと struct PARAM {   int  i;   char  str;   map<int, int>  map; }; のようにしていますが、<が不正です、のようなことを言われてうまくいきません。 構造体にmapを入れることは可能なのでしょうか? 可能ならばその方法を教えていただけると幸いです。 以上、ご教授願います。 環境は OS WindowsXP SP2 VC++6.0 です。

質問者が選んだベストアンサー

  • ベストアンサー
  • MrBan
  • ベストアンサー率53% (331/615)
回答No.4

補足ありがとうございます。エラーの通りですね。 > error C2501: 'map' : 識別名を宣言するのに、型が指定されていません。 VCの場合、知らない識別子があるとこのエラーが出て、 たいていはその後に「構文エラー」 「…の前に不正なトークンがあります。」になるかと思います。 ここでは「突然出てきたけどmapって何?」とコンパイラに判断された。 > こんな感じです。mapをインクルードしたら消えました。 症状に対する解決策ですので、そのエラーは消えると思います。 結果として使えるようになったのでしょうか。

その他の回答 (4)

  • ddnp009
  • ベストアンサー率25% (15/58)
回答No.5

map<int, int>  map; ↓ std::map<int, int>  map;

  • MrBan
  • ベストアンサー率53% (331/615)
回答No.3

> コードの全体と、正確なエラーメッセージを補足した方がよいかもしれません。 同意。 > 構造体にmapを入れることは可能なのでしょうか? C++ではstructもclassも大差ありません。勿論可能です。 # extern "C"の有無なども含めてもろもろ確認したいところ。

iec1128
質問者

補足

答えられる範囲でお答えさせていただきます。 >コード全体を補足 コード全部を表示するということですか? コードが長いので無理だと思います。 このcppファイルだけで200KB程度あります。 >正確なエラーメッセージ failname(1111) : error C2143: 構文エラー : ';' が '<' の前に必要です。 failname(1111) : error C2501: 'map' : 識別名を宣言するのに、型が指定されていません。 failname(1111) : error C2059: 構文エラー : '<' failname(1111) : error C2238: ';' の前に不正なトークンがあります。 こんな感じです。mapをインクルードしたら消えました。 ># extern "C"の有無なども含めてもろもろ確認したいところ。 #ifdef __cplusplus extern "C" { #endif こんな感じであります。 捕捉になっているかわかりませんが以上です。

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.2

>_map1には値が入っているときそれを_map2にコピーするには >どのようにしたらよいでしょうか? _map2 = _map1;

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.1

コードの全体と、正確なエラーメッセージを補足した方がよいかもしれません。 私の環境では普通に動きますよ。(FreeBSD 6.3 gcc 3.4.6) # char 型の変数名を str としたり、map<int, int> 型の変数名を map としたり # やめた方がいいですよ。

iec1128
質問者

補足

ご回答ありがとうございます。 #include <map>を忘れていただけでした。 再びお聞きしたいのですが map<int, int> _map1; map<int, int> _map2; があるとして、_map1には値が入っているときそれを_map2にコピーするには どのようにしたらよいでしょうか? 変数名のつけ方ですがまだ慣れていないので思いついたものでやってしまいます。これから気をつけていきます。

関連するQ&A

  • 構造体で配列を使用しない方法。

    構造体で配列を使用せずに、メモリ領域を獲得する関数を使用する場合はどうすればよろしいですか??  例 char *str; struct seiseki{ char name[20]; int eig; int suu; int kok; char rank[3]; }; str = ()malloc();

  • 文字列扱い方

    構造体の中の配列へ文字列を入れる方法がわからなくてこまっています! #include <stdio.h> struct TEST{     char str[32]; }; int main(){     TEST test;     test.str = "test";     return 0; } このように入力するとconst char [5]' から 'char [32]' に変換できません。と出てしまいます。 何か良い方法がありましたらぜひご教授お願いいたします。

  • 既定のコンストラクタがない?

    次のコードをビルドすると 「error C2512: 'Hoge' : クラス、構造体、共用体に既定のコンストラクタがありません。 」 とでるのですが、なぜそのようになるのかわかりません。 環境はVC8、XP sp2 になります。 struct Boo {int handle_;}; struct Hoge { Hoge(Boo&){} }; int main() { Boo boo; Hoge( boo ); } これは一体どういうことなのでしょうか? ご教授よろしくお願いします。

  • 構造体について

    以下のような構造体の宣言が合ったとき struct list { int a; char b[20]; struct list *next; }; struct list *add_list( int a, char *str, struct list *head );・・・1 struct list *del_list( int a, struct list *head );・・・2 1は引数の数が同じため問題ないのですが、2はどういう意味になるのでしょう?

  • 可変長構造体をファイルから読み込み処理

    可変長の構造体、 typedef struct 構造体(仮) { char c1,c2; float f1,f2; double d; int size; //↓strのサイズ char str[1]; //文字配列 }構造体(仮); の形式で書かれたバイナリデータファイルがあります。 そのファイルを読み込んでcsv形式で出力する処理を、 ファイルからの読み込む回数を減らしてやりたいと思っています。 その方法を教えていただけませんか? よろしくおねがいします。

  • 構造体のすべての変数を文字列に変換したい

    以下のような3つの構造体が与えられたときに、構造体tdが初期化されているとします。 そのときに、構造体tdのすべての要素を文字列に変換したいのですが,ひとつひとつ sprintf を使って変換するのは、ソースファイルにひとつずつ書かなければならず、あまり用いたくありません。 何かよい方法はないのでしょうか? ご回答よろしくお願いします。 struct area{  int x;  int y;  int r[20]; }; struct pinf{  struct area;  int s;  int r[18]; }; struct td{  char no[4];  char name[20];  struct pinf p1,p2[10];  int tpc;  int r[20]; };

  • 構造体を引数とする関数について

    関数に構造体を渡したいのですが、エラーが出て上手くいきません。 下のプログラムのように組んでいるのですが、どこが問題なのかご教授願いたいです。 もし、下記のプログラムのようなことができないのでしたら、代替案を提示してもらえると助かります。 環境はVC++です。よろしくお願いします。 struct DATA{ int x; char name[32]; }; void info(DATA *status[]); int main(void){ DATA student[3] = { { 1, "佐藤" }, { 2, "高橋" }, { 3, "田中" }, }; info(&student[]); return 0; } void info(DATA *status[]){ for (int i = 0; i < 3; i++){ printf("%d\n%s", status[i]->x, status[i]->name); } }

  • CreateFileMapping について

    CreateFileMapping を使用し アプリケーション間のデータ共有プログラムを作成しています。 CreateFileMapping には構造体を登録し その構造体で 文字列配列を動的に確保したいのですが // 構造体 typedef struct {   char **huga; } HOGE; main ---------------------------------- // マップ map = CreateFileMapping(   (HANDLE)0xffffffff,   NULL,   PAGE_READWRITE | SEC_COMMIT,   0, sizeof(HOGE),   "MAP_NAME"); // ビュー data = ( HOGE * )MapViewOfFile( map, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(HOGE) ); // 初回 flag = ( GetLastError() == ERROR_ALREADY_EXISTS ); if ( !flag ) {   // 確保 1   data->huga = new char*[ 10 ];   for ( int i = 0; i < 10; i++ ) {     // 確保 2     data->huga[ i ] = new char[ 256 ]; sprintf_s( data->huga[ i ], 256, "[ %d ]", i );   } } // 確認 for ( int i = 0; i < 10; i++ ) {   MessageBox( NULL, data->huga[ i ], "MAP", MB_OK ); } 上記のようにすると 確保する前の構造体が Mappingされているのか データを共有することが出来ませんでした。 動的確保した文字列配列を共有するには どのように設計すれば宜しいでしょうか。 よろしくお願いします。

  • リスト構造の設定のしかた

    メンバ変数が配列のlist_before構造体に設定してあるものを、リスト構造のlist_after構造体に設定し直したいです。 どのように設定すればいいのでしょうか? また、list_before構造体とlist_after構造体を引数にした関数で設定したいのですが呼び出し元と先の引数はどう書けばいいのでしょうか? その際の構造体とメンバ変数は以下になります。 ご教授どうぞ宜しくお願いいたします。 struct list_before { char *name[5]; int size[5]; }; struct list_after { char *name; int size; struct list *next; };

  • C言語で型汎用性のある関数を作成したい

    C言語です。 下記のコードでは、期待した通りにメンバにアクセスできるのですが、 構造体のメンバが多くなったとき、構造体をネストしているときには、 挙動がおかしく(なにか別の値をとりだしてしまっている?)なります。 どのようにしたら型汎用のある関数を書くことができるでしょうか? (C++ならば、汎用(テンプレート)関数があるけれども。。。) #include <stdio.h> struct hanyo{ int i; }; struct aaa{ int i; long l; char str[100]; }; struct bbb{ int i; }; void hoge(hanyo *ph){ printf("%d\n", ph->i); return; } int main(){ aaa a; a.i = 1; bbb b; b.i = 2; hoge((hanyo *)&a); hoge((hanyo *)&b); return 0; } ----実行結果---- 1 2 続行するには何かキーを押してください . . .

専門家に質問してみよう