我正在使用Visual Studio 2017编写标准的Win32 Windows UI程序。但是当我尝试将以下头文件包含到MyMainWin.cpp文件(您定义窗口和消息处理)时,它抱怨了许多语法错误。例如,它抱怨“在类定义结尾处的行';'”之前的“意外令牌”;};如果我将以下头文件包含到控制台应用程序main.cpp中,它工作正常。为什么?
#ifndef _MY_RAND_H_
#define _MY_RAND_H_
#include <random>
#include <tuple>
#include <iostream>
namespace myown {
void srand(int seed);
int rand();
template<class IntType = int>
class my_uniform_int_distribution {
public:
// types
typedef IntType result_type;
typedef std::pair<int, int> param_type;
// constructors and reset functions
explicit my_uniform_int_distribution(IntType a = 0, IntType b = std::numeric_limits<IntType>::max());
explicit my_uniform_int_distribution(const param_type& parm);
void reset();
// generating functions
template<class URNG>
result_type operator()(URNG& g);
template<class URNG>
result_type operator()(URNG& g, const param_type& parm);
// property functions
result_type a() const;
result_type b() const;
param_type param() const;
void param(const param_type& parm);
result_type min() const;
result_type max() const;
private:
typedef typename std::make_unsigned<IntType>::type diff_type;
IntType lower;
IntType upper;
}; //visual studio compiler complains "unexpected token(s) preceding';'" here
//method definition...
}
#endif
您可能遇到问题,因为您使用std::numeric_limits<IntType>::max()
。 windows.h
最终包括一个文件minwindef.h
,它定义了不幸的宏max
和min
。来自minwindef.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 */
如果在自定义标头之前包含windows.h
,那么std::numeric_limits<IntType>::max()
表达式将扩展为std::numeric_limits<IntType>::((() > ()) ? () : ())
,这是无效的语法。
有两种可能的解决方案:
#define NOMINMAX
包括windows.h
之前 - 这是一个很好的做法,因为这些min
/ max
宏(及其非窗口形式MIN
和MAX
)是一个众所周知的问题原因windows.h
之前包含你的自定义标题 - 这不是最好的方法,因为它要求你的自定义标题的用户有一些额外的知识