Как решить MSVC обработку шаблонов функций C ++, которая отличается от обработки GCC / Clang (неузнаваемое определение шаблона)? - PullRequest
3 голосов
/ 23 марта 2019

Существует вспомогательная функция шаблона

#include <iostream>

namespace helpers {

  template <typename OUT = float, typename IN>
  OUT normalizeFromRange(IN v, IN min, IN max) {
    return static_cast<OUT>(v - min) / static_cast<OUT>(max - min);
  }

}

int main()
{
    float resultFAuto = helpers::normalizeFromRange<>(10, 0, 40);
    float resultF = helpers::normalizeFromRange<float>(20, 0, 40);
    double resultD = helpers::normalizeFromRange<double>(30, 0, 40);

    std::cout << "resultFAuto: " << resultFAuto << std::endl;
    std::cout << "resultF: " << resultF << std::endl;
    std::cout << "resultD: " << resultD << std::endl;

    return 0;
}

приводит к

resultFAuto: 0.25
resultF: 0.5
resultD: 0.75

Она компилируется в Clang, GCC, которые я использую.C ++ 14.Я хочу построить проект также на MSVC ++, и он компилируется на онлайн-компиляторе MSVC ++ , который утверждает, что использует 19.00.23506

Но он не работает на моей машине, использующей 19.16.27027.1, C ++14 set.

Microsoft Visual Studio Community 2017 
Version 15.9.9
VisualStudio.15.Release/15.9.9+28307.518
Installed Version: Community
Microsoft Visual C++ 2017
Microsoft (R) C/C++ Optimizing Compiler Version 19.16.27027.1

с

error C2988: unrecognizable template declaration/definition
error C2059: syntax error: '('
error C2143: syntax error: missing ';' before '{'
error C2447: '{': missing function header (old-style formal list?)

Определена ли функция шаблона с неверным синтаксисом для спецификации (а GCC, Clang, некоторые версии MSVC ++ просто каким-то образом проходят)?
Или это что-то специфичное для MSVC, флаги MSVC или еще недавно специфичное для MSVC?
Что-то еще?
Существует одна похожая проблема , но мои знания о шаблонах не позволяютПосмотрите, как это применимо здесь.

1 Ответ

4 голосов
/ 23 марта 2019

Ваш проект включает windows.h?

Включая windows.h также вводит определения препроцессора для OUT и IN, которые, я думаю, вызывают эту ошибку.

Изменение типовых имен шаблонов на OUTX и INX исправляет ошибки на моем компьютере.

Я нашел связанный вопрос SO: Макросы IN и OUT в minwindef.h

...