Программирование Win32 не может включать файл заголовка шаблона - PullRequest
0 голосов
/ 12 марта 2019

Я пишу стандартную программу Win32 Windows UI с Visual Studio 2017. Но когда я попытался включить следующий файл заголовка в файл 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

1 Ответ

1 голос
/ 13 марта 2019

Возможно, у вас проблемы с использованием 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 - это не лучший подход, потому что он требует от пользователей вашего пользовательского заголовка дополнительных знаний
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...