Win32编程不能包含模板头文件

问题描述 投票:0回答:1

我正在使用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
templates winapi
1个回答
1
投票

您可能遇到问题,因为您使用std::numeric_limits<IntType>::max()windows.h最终包括一个文件minwindef.h,它定义了不幸的宏maxmin。来自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宏(及其非窗口形式MINMAX)是一个众所周知的问题原因
  • windows.h之前包含你的自定义标题 - 这不是最好的方法,因为它要求你的自定义标题的用户有一些额外的知识
© www.soinside.com 2019 - 2024. All rights reserved.