中級のC++エラー 39問
13種類のエラーを、それぞれ複数パターンずつ収録しています。
- error: invalid conversion from 'int*' to 'int' の原因と直し方アドレス演算子&で得たポインタを、参照や普通の変数と混同して代入しようとしたときに出るエラーです。&xはint*型であり、int型の変数にそのまま代入することはできません。
- nullptrの参照外しでSegmentation faultになる原因nullptrで初期化したポインタをそのまま参照外し(*p)して書き込もうとしたときに異常終了するバグです。コンパイルは通り、実行時にクラッシュします。
- C++でerror: assignment of read-only variable が出る原因と直し方constを付けて宣言した変数に、あとから値を代入しようとしたときに出るエラーです。constは「この変数は初期化後に変更しない」という約束をコンパイラに伝えるものです。
- 参照渡しのつもりが値渡しで変更が反映されないバグ関数の引数を値渡し(int n)で受け取っているのに、関数の中身を書き換えたつもりで呼び出し元の変数まで変わることを期待してしまうバグです。値渡しでは引数はコピーされるため、関数内での変更は呼び出し元に影響しません。
- terminate called after throwing an instance of 'std::out_of_range' の原因と直し方std::vectorの範囲外の要素に .at() でアクセスしたときに、例外std::out_of_rangeが投げられ、それを捕まえずにプログラムが終了してしまうバグです。
- error: is private within this context の原因と直し方private指定されたクラスのメンバ変数に、クラスの外から直接アクセスしようとしたときに出るエラーです。カプセル化のためにprivateメンバは外部から直接触れないようになっています。
- error: expected ';' after class definition の原因と直し方クラス定義の閉じ波括弧}の後にセミコロンを書き忘れたときに出るエラーです。C++特有の落とし穴で、if文や関数定義の}にはセミコロンは要りませんが、クラスや構造体の定義には必要です。
- error: no matching function for call to 'Class::Class()' の原因と直し方引数ありのコンストラクタだけを自分で定義したクラスに対して、引数なしでインスタンスを作ろうとしたときに出るエラーです。
- error: call of overloaded '...' is ambiguous の原因と直し方同じ名前の関数が複数のオーバーロードを持ち、渡した引数の型からどちらを呼ぶべきかコンパイラが一意に決められないときに出るエラーです。
- switch文でbreakを忘れて後続のcaseまで実行されるバグswitch文の各case節末尾にbreakを書き忘れ、該当したcase以降のすべての節が続けて実行されてしまうバグです。
- 配列と、先頭要素へのポインタでsizeofの結果が変わってしまう理由配列そのもの(nums)と、先頭要素のアドレス(&nums[0])を混同してsizeofに渡してしまうバグです。見た目は似ていますが、前者は配列全体のバイト数、後者はポインタ1個分のサイズを返します。
- undefined reference to 'Class::member' の原因と直し方(staticメンバ変数)クラス内でstaticメンバ変数を宣言しただけで、クラスの外側での実体定義を書き忘れたときにリンクの段階で出るエラーです。コンパイル自体は通りますが、実行ファイルを作る最後のリンク工程で失敗します。
- 範囲for文で要素をコピーしてしまい変更が反映されないバグfor (int n : nums) のように範囲for文の変数を値(コピー)で受け取っているため、ループの中でnを書き換えても元のvectorの要素は変わらないバグです。