c++ - 如何解决与 GCC/Clang 不同的 C++ 函数模板的 MSVC 处理(无法识别的模板定义)?

标签 c++ templates visual-c++ visual-studio-2017

存在模板辅助函数

#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++ 上构建项目,它 compiles on online MSVC++ compiler声称使用 19.00.23506

但它在我使用 19.16.27027.1、C++14 集的机器上失败了。

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、特定于 MSVcflags还是特定于最近的 MSVC?
还有别的吗?
one similar issue , 但我对模板的了解不允许看到它在这里如何应用。

最佳答案

您的项目是否包含windows.h

包括 windows.h 还为 OUTIN 引入预处理器定义,我认为这是导致此错误的原因。

将模板类型名称更改为 OUTXINX 修复了我机器上的错误。

我发现了一个相关的 SO 问题:IN and OUT macros in minwindef.h

关于c++ - 如何解决与 GCC/Clang 不同的 C++ 函数模板的 MSVC 处理(无法识别的模板定义)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55308451/

相关文章:

C++ 将字符串转换为 uint64_t

wpf - 使用模板和样式的可编辑 TreeView 节点

c++ - 解决模板不明确的问题

c++ - 使用按位或代替 std::max 来调整缓冲区大小

c++ - 将 getifaddrs 移植到 Win XP

c++ - 阻止调试器进入功能

c++ - SCons 检测到 Visual C++ v14.2 (2019) 但未检测到 v14.1 (2017)

visual-c++ - 如何在 MFC 对话框中添加关闭按钮

c++ - CMAKE_COMPILER_IS_GNUCXX 和 CMAKE_CXX_COMPILER_ID 为空

c++ - 使用默认模板参数引入派生类型