警告C4003およびエラーC2589およびC2059 on:x = std :: numeric_limits :: max();
-
19-09-2019 - |
質問
このラインは小さなテストプログラムで正しく機能しますが、私がそれを望んでいるプログラムでは、次のコンパイラの苦情を受け取ります。
#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();
マックスをマクロマックス(a、b)と見なしているのはなぜですか。 ?
解決
これは一般に、を定義するWindowsヘッダーを含めるときに発生します min
また max
大きい。 Windowsヘッダーを使用している場合は、PUTを使用してください #define NOMINMAX
コードで、または同等のコンパイラスイッチでビルドします(つまり、使用します /dnominmax ビジュアルスタジオ用)。
その建物に注意してください NOMINMAX
プログラム全体でマクロの使用を無効にします。使用する必要がある場合 min
また max
操作、使用 std::min()
また std::max()
から <algorithm>
ヘッダ。
他のヒント
他の解決策は、このような括弧で関数名を包むことです。 (std::numeric_limits<int>::max)()
. 。同じことが適用されます std::max
.
これが良い解決策であるかどうかはわかりません... nominmaxの方がIMOが優れていますが、これは場合によっては選択肢になる可能性があります。
他のいくつかのヘッダーファイルは、最大マクロでグローバルネームスペースを汚染しています。マクロを定義することでそれを修正できます:
#undef max
x = std::numeric_limits<int>::max();
#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
Visual Studio 2013(より良い間隔のためにフォーマットされている...)での私にとってのその定義は次のとおりです。
static _Ty (max)() _THROW0()
{ // return maximum value
return (FLT_MAX);
}
だから私はFLT_MAXを使用しているだけです。 :)これは普遍的な解決策ではないかもしれませんが、私の場合はうまく機能するので、共有すると思いました。
(std :: numeric_limits :: max)(
やさしい。