web-dev-qa-db-ja.com

std :: minはエラーを返します

#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 : '::'
95
hidayat

windows.hヘッダーファイル(より正確には、windef.hに含まれる)minおよびmaxのマクロが干渉しています。

あなたがすべき #define NOMINMAX含める前。

139
paxdiablo

何も定義する必要はありません。次の構文を使用してマクロをバイパスするだけです。

(std::min)(a, b); // added parentheses around function name
(std::max)(a, b);
74
PolyMesh

他の人が述べたように、エラーは、Windowsヘッダーで定義されている最小/最大マクロが原因です。それらを無効にする方法は3つあります。

1)#define NOMINMAXヘッダーを含める前に、これは一般に、次のヘッダーに影響を与えるためにマクロを定義する悪い手法です。

2)コンパイラコマンドライン/ IDEでNOMINMAXを定義します。この決定の悪い点は、ソースを出荷する場合、ユーザーに同じことを行うよう警告する必要があることです。

3)使用する前にコード内のマクロを単純に定義解除する

#undef min
#undef max

これはおそらく最もポータブルで柔軟なソリューションです。

24
Gene Bushuyev

Windowsヘッダーに時々問題があり、NOMINMAXのプロジェクト全体の定義が常に機能するとは限りません。括弧を使用する代わりに、次のように型を明示的にすることがあります。

int k = std::min<int>(3, 4);

これにより、プリプロセッサがminに一致することも停止し、括弧の回避策よりも間違いなく読みやすくなります。

17
Erik

次のようなものを試してください:

_#define NOMINMAX
#include <windows.h>
_

デフォルトでは、windows.hはminおよびmaxをマクロとして定義します。それらが展開されると、(たとえば)_std::min_を使用しようとするコードは次のようになります。

_int k = std::(x) < (y) ? (x) : (y);
_

エラーメッセージは、std::(x)が許可されていないことを示しています。

15
Jerry Coffin

私の場合、プロジェクトにはwindows.hまたはwindef.hが明示的に含まれていませんでした。 Boostを使用していました。そこで、プロジェクトProperties -> C/C++ -> Preprocessorに移動し、Preprocessor DefinitionsNOMINMAXを追加して問題を解決しました(VS 2013、VS 2015)。

4
Terry
#define NOMINMAX

maxとminのマクロ定義を抑制するトリックです

http://support.Microsoft.com/kb/143208

2
Foo Bah

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 ...
2
user2249683

Windows.hはminをマクロとして定義していると仮定します。好む

#define min(a,b)  ((a < b) ? a : b)

それはエラーメッセージを説明します。

1
sstn