50

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

#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) です。

4

2 に答える 2

118

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

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

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

#undef max
...
size_t maxValue_ = std::numeric_limits<size_t>::max()
于 2014-12-12T11:58:39.173 に答える