次のようなクラス構造体定義があります。
#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)です。
問題は、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()
_
他の人が言うように、問題は<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
を追加した方が良いでしょう。