web-dev-qa-db-ja.com

警告C4003とエラーC2589およびC2059:x = std :: numeric_limits <int> :: max();

この行は小さなテストプログラムでは正しく機能しますが、必要なプログラムでは、次のコンパイラの問題が発生します。

#include <limits>

x = std::numeric_limits<int>::max();

c:\...\x.cpp(192) : warning C4003: not enough actual parameters for macro 'max'
c:\...\x.cpp(192) : error C2589: '(' : illegal token on right side of '::'
c:\...\x.cpp(192) : error C2059: syntax error : '::'

私は同じ結果を得ます:

#include <limits>
using namespace std;

x = numeric_limits<int>::max();

なぜmaxをマクロmax(a、b)と見なすのですか? ?

56
Harvey

これは、minまたはmaxマクロを定義するWindowsヘッダーを含めるときに一般的に発生します。 Windowsヘッダーを使用している場合は、コードに_#define NOMINMAX_を挿入するか、同等のコンパイラスイッチを使用してビルドします(つまり、Visual Studioでは/ DNOMINMAXを使用します)。

NOMINMAXを使用してビルドすると、プログラム全体でのマクロの使用が無効になることに注意してください。 minまたはmax操作を使用する必要がある場合は、_<algorithm>_ヘッダーからstd::min()またはstd::max()を使用します。

74
Steve Guidi

その他の解決策は、関数名を次のように括弧で囲むことです:(std::numeric_limits<int>::max)()。同じことがstd::maxにも当てはまります。

これの良い解決策であるかどうかはわかりません... NOMINMAXの方がIMOが優れていますが、場合によってはこれがオプションになることもあります。

62
denis-bu

他のいくつかのヘッダーファイルは、maxマクロでグローバル名前空間を汚染しています。マクロを未定義にすることで修正できます:

#undef max
x = std::numeric_limits<int>::max();
27
#ifdef max
#pragma Push_macro("max")
#undef max
#define _restore_max_
#endif

#include <limits>

//... your stuff that uses limits

#ifdef _restore_max_
#pragma pop_macro("max")
#undef _restore_max_
#endif
3
dmjalund

(std :: numeric_limits :: max)()

やさしい。

0

Visual Studio 2013での定義(間隔を広げるようにフォーマットされています...)は次のとおりです。

static _Ty (max)() _THROW0()
{   // return maximum value
    return (FLT_MAX);
}

したがって、私はFLT_MAXを使用しています。 :)これは普遍的な解決策ではないかもしれませんが、私の場合はうまく機能するので、私は共有すると思いました。

0
Andrew