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

StackOverflow https://stackoverflow.com/questions/1904635

質問

このラインは小さなテストプログラムで正しく機能しますが、私がそれを望んでいるプログラムでは、次のコンパイラの苦情を受け取ります。

#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)(

やさしい。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top