#include <algorithm>
#include <Windows.h>
int main()
{
int k = std::min(3, 4);
return 0;
}
Windowsが何をしているのか、Windows.hをインクルードした場合、Visual Studio 2005ではstd :: minを使用できません。エラーメッセージは次のとおりです。
error C2589: '(' : illegal token on right side of '::'
error C2059: syntax error : '::'
windows.h
ヘッダーファイル(より正確には、windef.h
に含まれる)min
およびmax
のマクロが干渉しています。
あなたがすべき #define NOMINMAX
含める前。
何も定義する必要はありません。次の構文を使用してマクロをバイパスするだけです。
(std::min)(a, b); // added parentheses around function name
(std::max)(a, b);
他の人が述べたように、エラーは、Windowsヘッダーで定義されている最小/最大マクロが原因です。それらを無効にする方法は3つあります。
1)#define NOMINMAX
ヘッダーを含める前に、これは一般に、次のヘッダーに影響を与えるためにマクロを定義する悪い手法です。
2)コンパイラコマンドライン/ IDEでNOMINMAX
を定義します。この決定の悪い点は、ソースを出荷する場合、ユーザーに同じことを行うよう警告する必要があることです。
3)使用する前にコード内のマクロを単純に定義解除する
#undef min
#undef max
これはおそらく最もポータブルで柔軟なソリューションです。
Windowsヘッダーに時々問題があり、NOMINMAXのプロジェクト全体の定義が常に機能するとは限りません。括弧を使用する代わりに、次のように型を明示的にすることがあります。
int k = std::min<int>(3, 4);
これにより、プリプロセッサがmin
に一致することも停止し、括弧の回避策よりも間違いなく読みやすくなります。
次のようなものを試してください:
_#define NOMINMAX
#include <windows.h>
_
デフォルトでは、windows.hはmin
およびmax
をマクロとして定義します。それらが展開されると、(たとえば)_std::min
_を使用しようとするコードは次のようになります。
_int k = std::(x) < (y) ? (x) : (y);
_
エラーメッセージは、std::(x)
が許可されていないことを示しています。
私の場合、プロジェクトにはwindows.h
またはwindef.h
が明示的に含まれていませんでした。 Boostを使用していました。そこで、プロジェクトProperties -> C/C++ -> Preprocessor
に移動し、Preprocessor Definitions
にNOMINMAX
を追加して問題を解決しました(VS 2013、VS 2015)。
Windows.hを含むユーザーの場合、影響を受けるヘッダーに以下を入力します。
#include windows headers ...
pragma Push_macro("min")
pragma Push_macro("max")
#undef min
#undef max
#include headers expecting std::min/std::max ...
...
pragma pop_macro("min")
pragma pop_macro("max")
ソースファイルでは、#undef minとmaxのみです。
#include windows headers ...
#undef min
#undef max
#include headers expecting std::min/std::max ...
Windows.hはminをマクロとして定義していると仮定します。好む
#define min(a,b) ((a < b) ? a : b)
それはエラーメッセージを説明します。