web-dev-qa-db-ja.com

std :: numeric_limits :: maxの構文エラー

次のようなクラス構造体定義があります。

#include <limits>

struct heapStatsFilters
{
    heapStatsFilters(size_t minValue_ = 0, size_t maxValue_ = std::numeric_limits<size_t>::max())
    { 
         minMax[0] = minValue_; minMax[1] = maxValue_; 
    }

    size_t minMax[2];
};

問題は、「std :: numeric_limits :: max()」を使用できず、コンパイラが次のように言っていることです。

Error 8 error C2059: syntax error : '::'

Error 7 error C2589: '(' : illegal token on right side of '::'

私が使用しているコンパイラはVisual C++ 11(2012)です。

36
mmostajab

問題は、maxおよびminという名前のマクロ定義を含む_<Windows.h>_ヘッダーファイルが原因です。

_#define max(a,b) (((a) > (b)) ? (a) : (b))
_

この定義を見ると、プリプロセッサは式のmax識別子を置き換えます。

_std::numeric_limits<size_t>::max()
_

マクロ定義により、最終的に無効な構文につながる:

_std::numeric_limits<size_t>::(((a) > (b)) ? (a) : (b))
_

コンパイラエラーで報告されました:_'(' : illegal token on right side of '::'_。

回避策として、NOMINMAX defineをコンパイラフラグ(またはヘッダーを含める前の変換単位)に追加できます。

_#define NOMINMAX   
_

または、maxへの呼び出しを括弧で囲み、マクロの展開を防ぎます。

_size_t maxValue_ = (std::numeric_limits<size_t>::max)()
//                 ^                                ^
_

またはnumeric_limits<size_t>::max()を呼び出す前に_#undef max_:

_#undef max
...
size_t maxValue_ = std::numeric_limits<size_t>::max()
_
83
Piotr Skotnicki

他の人が言うように、問題は<WinDefs.h><windows.h>に含まれる)でマクロminおよびmaxが定義されているが、それが宣言されている場合:

// <WinDefs.h>
#ifndef NOMINMAX

#ifndef max
#define max(a,b)            (((a) > (b)) ? (a) : (b))
#endif

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

#endif  /* NOMINMAX */

マクロNOMINMAXが定義されている場合、WinDefs.hはこれらのマクロを生成しません。

そのため、プロジェクトにdefine NOMINMAXを追加した方が良いでしょう。

8
borisbn