PRB: STL を使用して Windows プログラムで発生する可能性が最小/最大の競合

サポートが終了した KB の内容についての免責事項

この記事は、マイクロソフトがサポートを提供しなくなった製品について記述しています。 したがって、この記事は「現状のまま」で提供され、更新されることはありません。

現象

標準テンプレート ライブラリ (STL) を使用する windows ベースのプログラムはコンパイルされず、いくつかの無効なパラメーターと構文エラーが生成されます。

原因

問題は、min と max の競合する定義で発生します。Min および max」は次のように Windef.h でマクロとして定義されます。
   #ifndef NOMINMAX   #ifndef max
#define max(a,b) (((a) > (b)) ? (a) : (b))
#endif

#ifndef min
#define min(a,b) (((a) < (b)) ? (a) : (b))
#endif
#endif /* NOMINMAX */

: Windef.h が、ほぼすべての Windows ベースのプログラムに含まれている Windows.h で含まれます。

Min および max は、template 宣言された関数の標準テンプレート ライブラリ (STL) として定義されます。次の最小値と最大値の定義は、ファイル Algobase.h を参照してください。

   template <class T>   inline const T& min(const T& a, const T& b) {
return b < a ? b : a;
}
template <class T, class Compare>
inline const T& min(const T& a, const T& b, Compare comp) {
return comp(b, a) ? b : a;
}
template <class T>
inline const T& max(const T& a, const T& b) {
return a < b ? b : a;
}
template <class T, class Compare>
inline const T& max(const T& a, const T& b, Compare comp) {
return comp(a, b) ? b : a;
}

Windef.h の定義は、マクロであるため、構文のエラーが発生する関数の定義と両方 Windef.h (Windows.h) され (STL) から Algobase.h が含まれています。正確なエラーは、2 つのコンパイルに使用される順序によって異なります。

解決策

NOMINMAX のプリプロセッサ シンボルを定義します。これは、Developer Studio プロジェクトをビルド、設定、C または C++] タブの [プリプロセッサ] カテゴリで、上で実行できます。これは、最小、Windef.h で最大の定義に表示されません。

状況

これは仕様による動作です。
プロパティ

文書番号:143208 - 最終更新日: 2017/01/31 - リビジョン: 1

フィードバック