l_n_m’s diary

よわい電気系の日記(本当にただの日記)

VS C++コンパイルエラー

C2065 定義されていない識別子です

確かに。これはコード中で「std::list」とかの「std::」が抜けていたときに出る。

名前空間が違うのだからそりゃ確かに定義されていない。その通りだ。

「std::」を書いて解決。

未解決の外部参照

関数名がちらっとエラーメッセージ中に出てくるのでその関数の定義部をみる。たぶん何処にも書かれていない。

というわけで関数を定義して終了。

……というのがいつもの流れ。今回はここで詰まった。プロジェクトが何故かcppやhを自動で追加してくれないので手動で追加している(原因探すのも面倒くさいしそんなによくあることではないので気に留めていない)けれど、それをやり忘れていた。

厄介なのは、#include "hogehoge.h"とかの部分ではエラーを吐かず、しかもインテリセンスは正常に動作すること。関数を呼び出しているところを見ても、エラーの表示は無い。

というわけで未解決の外部参照が出たらこのことも思い出したい。

C4430 型指定子が見つかりません

今回一番詰まったのがこのエラー。

関数の頭には戻り値の型を書くのが普通です。そんなことは知っています。流石にそれも分からないで「C++少しわかるよ!」なんて言う人がいたらデューオ先生のジャスティスワンでも食らってください。

これがコンストラクタで出てくるのだから困ってしまいます。コンストラクタに型指定子なんか無いのだから、正常なことをエラーだと検知しているのではないか、VSクソだ、と言ってしまいたくなるところ。

ですが実際にそこを見てみると、コーディングが間違っていました。コンストラクタの引数に、

class Hoge{ public: Hoge(list&) };

となっていました。そう。さっきのC2065が本当のエラーだったのです。

コンパイラが誤判断しているわけですね……わけの分からないエラーメッセージが出たときにはその周辺をよく見ると全然違うミスをしているかも。

 

おわりに

エラーの起きない書き方をしたいですね。using namespace std;を書かないなら絶対にstd::を忘れないようにとか。

あと……C++使うならC++11使おうよっ! 便利な書き方いっぱいです。いや、速さとかまで言われると分かりませんけど。