41

私は最近追加しました:

#define NOMINMAX
#include <Windows.h>
#include <algorithm>

使用するために私のmain.cppに

std::max( x , x ); // x is just a placeholder and not actual anything
std::min( x  , x );

std::max()/std::min()しかし、他のファイルでは使用できません。

error C2589: '(' : illegal token on right side of '::'
error C2059: syntax error : '::'

他のファイルを追加しようとしまし#define NOMINMAXたが、失敗します。手がかりは何ですか?

質問する前に周りを見回しましたが、答えがわかりませんVisual C++ での NOMINMAX に関する問題の可能性

4

4 に答える 4

96

本当に必死なら、関数名を括弧で囲んでください:

(std::min)(x, y);

この構文は、関数のようなマクロを適用しません。(正式には、関数のようなマクロを適用するには、マクロの名前の後にオプションの空白と「(」を付ける必要があります。)

于 2012-11-16T16:45:34.517 に答える
34

NOMINMAXコンパイラ フラグを使用して定義します。

> cl.exe -DNOMINMAX ...

これは、すべてのソース ファイルに対して定義されます。私は IDE を使用しませんが、このページでは IDE をナビゲートしてこれを設定するためのガイダンスを提供します: Windows プログラムで STL を使用すると、最小/最大の競合が発生する 可能性があります。

NOMINMAX プリプロセッサ シンボルを定義するだけです。これは、Developer Studio プロジェクトの [ビルド]、[設定]、[C/C++] タブ、[プリプロセッサ] カテゴリで実行できます。これにより、Windef.h の最小および最大定義が抑制されます。

于 2012-11-16T12:22:14.460 に答える
7

あなたの問題は、あなたがあなたを追いかけていることである可能性があり#define NOMINMAXます#include "windows.h"#define最初に来ることが重要です。

その理由は、windows.h (実際には、windows.h に含まれている windef.h だと思います) に次のようなコードがあるためです。

#ifndef NOMINMAX
#define min(x,y) ((x) < (y) ? (x) : (y))
#define max(x,y) ((x) > (y) ? (x) : (y))
#endif

#define NOMINMAXの定義をスキップするようにコンパイラ (または実際にはプリプロセッサ) に指示することもできますが、それは の前に実行した場合にのみ適用されます。minmax#include "windows.h"

于 2014-08-18T04:11:50.423 に答える