【コード】[追記]std::map と C2061: 構文エラー : 識別子 '_Wherenode'

[追記は一番下]

つい先日 std::map を使ってみようと思い、
早速プロジェクトに導入しようとしました。

サンプルプログラムでキーと要素の登録は出来ましたので
どういう場面で使うのか…
そこが問題ではありましたが、丁度うちのゲームでそろそろ敵を出したいな~
と思ってたのでそこに使ってみようと思いました。

Excel で表を作成し、敵の出現情報を管理させるのが簡単そうだったので
そこで敵の ID を一緒に埋め込んでファイル読み込み時に ID と情報を関連付けさせる計画を立てました。


#include <map>
#include <string>

class CEnemyData;

class CSample
{
private:
std::map<std::string, CEnemyData*> m_EnemyData;
public:
CSample();
~CSample();
};


単なるサンプルですが、ヘッダにこんな感じのクラスを作成し
ソース側で m_EnemyData を使ってみると…

error C2061: 構文エラー : 識別子 '_Wherenode'

こんなエラーが…
エラーを F1 のヘルプで検索しても全然意味不明。
サンプルではこんなん出なかったのに何なんだろうか…。


#ifdef _DEBUG
#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
#endif


原因は先日導入したメモリリークの場所を特定するこのマクロのようです。
このマクロより後に #include <map> をすると駄目なようです。
なので、このマクロより前に include してしまうか、
削除することで解決できるようです。

この記述はデバッグ版でビルドしている時に起こるエラーで、
リリース版でのビルドではエラーは出ないんですが、
なんか腑に落ちない解決の仕方でした。

とりあえず直ったので、
ファイルから敵情報を読み込むためのパーサーでも作成していきたいと思います。



[--- 追記 ---]
map や vector 等のコンテナは内部で operator new が定義されており、
このマクロの new と内部の new とが噛み合ってなかったためにこのエラーが出てきました。

本来 C/C++ の予約語等の名前と同じマクロを書いてしまっている…
それが間違いだった事に気付けませんでした。


#ifdef _DEBUG
#define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__)
#endif


例えば解決策として名前を変更したり、
どうしても new がいいんだ! と言うのであれば上記の解決策のように
ヘッダをマクロよりも手前で include してしまうのがいいでしょうけど、
やっぱりやめといた方がいいと思います。

予約語とバッティングしたエラーが出たのは今まで始めてだったので
凄くいい勉強になりました。

この追記記事が書けるようになったのと、解決に導いて下さった Justy さん。
本当にありがとうございます!!

この記事へのコメント

- Justy - 2012年09月05日 11:08:57

 C++の予約されているキーワードをマクロ定義してはダメだったはずですよ。
 別の名前にしてみては?

- DVDM♪管理人♪ - 2012年09月06日 02:40:43

>> Justy さん
な、なるほど・・・言われてから気付きました;

vector や map 等、
new 演算子をオーバーロードしていたような気がするので
仰る通りこういう不具合が起こったのだろうと思います。

このマクロの前に map を include して解決出来たのは
operator new が定義された後のマクロなので大丈夫だっただけなんですね。

map 等のコンテナ内で使われている
new でメモリリークしているとは考えなくても大丈夫そうですね。
恐らくそういう所はしっかり設計されていると思いますし…。


コンパイルが通ったから良しとしていましたが、
さすがにこれはまずすぎるので早々に修正しました。

いつも疑問が解決してスッキリした状態になるので本当に感謝しています><
今回もありがとうございました♪

トラックバック

まっとめBLOG速報 - 2012年11月02日 16:25

まとめ【【コード】[追記]std:】

[追記は一番下]つい先日 std::map を使ってみようと思い、早速プロジェクトに導入しようとしました。サン

URL :

検索フォーム
プロフィール

DVDM

Author:DVDM
自作ゲームの開発過程ブログ。
赤髪愛なら誰にも負けない。

 
Pixiv バナー


ブロとも申請フォーム
最新記事
カテゴリ
最新コメント
最新トラックバック
RSSリンクの表示
リンク
ブロとも一覧