互換性に影響するコンパイル時の変更点についてのまとめ
更新 : 2007 年 11 月
ここでは、Visual C++ 2003 より前にはエラーまたは警告なしにコンパイルされていたコードに対し、現在では発行されるようになったコンパイル時エラーと警告について要約しています。ただし、準拠関連のコンパイル時の変更については、Visual C++ 2005 で導入されたものもあります。
定義済みプリプロセッサ ディレクティブに右かっこが必要になりました (C2004)。
typename キーワードがない明示的な特殊化では、プライマリ テンプレートからテンプレート パラメータを検出できなくなりました (C2146 )。
プロテクト メンバ (n) には、そのメンバ (n) が属するクラス (A) の継承クラス (B) のメンバ関数を通じてだけアクセスできます (C2247)。
コンパイラでのアクセシビリティ チェックが改善され、アクセスできない基本クラスを検出できるようなりました (C2247)。
コピー コンストラクタおよびコピー代入演算子に明示的な特殊化を使用できなくなりました (C2299)。
デストラクタまたはコピー コンストラクタにアクセスできない場合、例外をキャッチできなくなりました (C2316)。
関数へのポインタに既定の引数は使用できなくなりました (C2383)。
静的データ メンバは、派生クラスを使って初期化できなくなりました (C2477)。
typedef の初期化は、標準では許可されていないため、現在はコンパイラ エラーになります (C2513)。
bool は適切な型になりました (C2632)。
UDC では、オーバーロードされた演算子についてあいまいさが発生するようになりました (C2666)。
修飾変換は ID 変換と同じではありません (C2666)。
有効な null ポインタ定数と考えられる式が増えました (C2668)。
以前はコンパイラが推測していた場所に template<> が必要になりました (C2768)。
テンプレート クラスの特殊化によって既に明示的に特化しているメンバ関数の場合、そのクラスの外側でそのメンバ関数から特化したメンバ関数は無効になります (C2910)。
すべての明示的な特化で、そのパラメータとして、プライマリ テンプレートのパラメータと一致するパラメータを選択する必要があります (C2912)。
浮動小数点非型テンプレート パラメータは許可されなくなりました (C2993)。
クラス テンプレートは、テンプレート型引数として使用できません (C3206)。
フレンド関数名は、そこに含まれる名前空間から始まらなくなりました (C3767)。
ポインタからメンバへの準拠が強化されました (C3867)。
コンパイラは、マクロ内の余分なコンマを受け入れることができなくなりました (C4002)。
形式 () の初期化子で構築される POD 型のオブジェクトは既定で初期化されるようになりました (C4345)。
依存名を型として扱う場合には typename キーワードが必要になります (C4346)。
テンプレートの特殊化として不適切に処理されていた関数の処理が、改善されました (C4347)。
静的データ メンバは、派生クラスを使って初期化できなくなりました (C4356)。
クラス テンプレートの特殊な形式は、戻り値の型で使用される前に定義されている必要があります (C4686)。
コンパイラが、制御が渡らないコードを報告するようになりました (C4702)。
新しい非テンプレート関数を宣言するフレンド宣言を定義しなければならなくなりました (LNK2019)。