Qt 5.15.1搭配MSVC2019 64位编译器编译std::tuple示例代码报错的原因及解决方法
为什么MSVC2019编译tuple代码报错,MinGW却正常?
我来帮你分析这个问题——你遇到的是MSVC2019标准库和Qt5.15.1环境组合下的一个模板推导兼容性问题,具体原因和解决办法如下:
错误原因
这个报错的核心是MSVC2019的STL在处理std::make_tuple时,对于char字面量和std::string组合的场景,触发了模板参数推导的SFINAE替换失败。
MinGW使用的是GNU的libstdc++标准库,它的std::make_tuple实现逻辑和MSVC的STL不同,不会出现这个推导冲突。而在Qt5.15.1搭配MSVC2019的环境中,要么是MSVC的STL对char字面量的推导(误将'C'这类字符字面量识别为int而非char)出了问题,要么是Qt项目默认的某些编译选项(比如字符编码相关的宏)干扰了模板匹配,最终导致编译器找不到匹配的std::make_tuple重载。
解决办法
这里有几个简单可行的修复方案,你可以根据自己的需求选择:
1. 显式指定std::make_tuple的模板参数
直接告诉编译器我们需要的模板参数类型,跳过自动推导的过程:
if (id == 1) return std::make_tuple<double, char, std::string>(2.9, 'C', std::string("Milhouse Van Houten")); if (id == 2) return std::make_tuple<double, char, std::string>(1.7, 'D', std::string("Ralph Wiggum"));
2. 强制转换char字面量的类型
把字符字面量显式转换成char,帮助编译器正确识别参数类型:
if (id == 1) return std::make_tuple(2.9, static_cast<char>('C'), std::string("Milhouse Van Houten")); if (id == 2) return std::make_tuple(1.7, static_cast<char>('D'), std::string("Ralph Wiggum"));
3. 直接构造std::tuple
绕过std::make_tuple的推导逻辑,直接使用std::tuple的构造函数:
if (id == 1) return std::tuple<double, char, std::string>(2.9, 'C', "Milhouse Van Houten"); if (id == 2) return std::tuple<double, char, std::string>(1.7, 'D', "Ralph Wiggum");
4. 调整项目编译选项
检查Qt项目的编译设置,看看是否启用了可能干扰类型推导的选项。比如如果不需要C++17的char8_t支持,可以关闭/Zc:char8_t选项;如果项目不需要宽字符支持,也可以尝试关闭UNICODE宏。这些设置都可以在Qt Creator的项目配置中找到并调整。
内容的提问来源于stack exchange,提问作者Mohammad Rahimi
相关产品推荐
相关产品推荐

