Qt 5.14.2 在向 std::map 插入元素时出现语义问题
Posted
技术标签:
【中文标题】Qt 5.14.2 在向 std::map 插入元素时出现语义问题【英文标题】:Qt 5.14.2 gets semantic issues when inserting elements to std::map 【发布时间】:2021-08-25 08:52:57 【问题描述】:我在 win10 系统中使用 Qt 5.14.2(MSVC2017 编译器)。当我用 std::map 插入数据时,出现编译错误。
#include "mainwindow.h"
#include <map>
#include <utility>
#include <QApplication>
int main(int argc, char *argv[])
QApplication app(argc, argv);
MainWindow w;
w.show();
std::map<int, int> mymap;
auto a = std::make_pair(5,6); //no error message
//semantic issue: no matching member function for call to 'insert'
mymap.insert(std::make_pair(1,2));
//semantic issue: no matching member function for call to 'insert'
mymap.insert(a);
mymap.insert(3, 4); //no error message
return app.exec();
另外,我以前用Qt 5.4.2(MSVC2012编译器)编译没有问题。
——————————————————————————————————————————
我弄错了,是红圈标注的语义问题,不是错误,不影响程序结果。我之前使用的以前的 Qt 5.4.2 版本没有这个语义问题。
与Qt语义问题相关的问题:
Semantic Issue Qt Creator: no member named 'cout' in namespace 'std'
QtCreator semantic issue warning code will never be executed
error use of undeclared identifier 'mainwindow' semantic issue in QtCreator
【问题讨论】:
为什么这和Qt有关? 因为我是在Qt开发的。 onlinegdb.com/9KTSKiFq0 此代码编译并且似乎可以工作。我相信 MSVC2017 有一些问题?或者您发布了部分代码,没有实际问题? 适用于 MSVC 2019,即 14.29.30037 您的编译器太旧了。 @Adrian Maire 我以前用Qt 5.4.2(MSVC2012) 也可以,但是最近需要升级到Qt 5.14.2(MSVC2017),之前的代码编译出错。以上代码和错误是在 Qt 5.14.2(MSVC2017) 中运行的。 【参考方案1】:您正在尝试使用std::pair<iterator, bool> insert( value_type&& value );
或std::map
。该重载是由 C++17 引入的。你的编译器太旧了,它不符合 C++17。您必须升级到的最低版本似乎是 MSVC 19.0(更新 2)*,即 VS 2015。通过升级到 MSVC 2019 更好地升级到完整的 C++17 甚至更高版本。无论如何,VS 2015-2019 在许多方面都兼容,如 ABI。一般来说,使用最新的工具和库总是好的做法。此外,您的问题与 Qt 没有任何关系。
我已经使用 VS 2019 和 also with the oldest available on compiler explorer 在本地对其进行了测试。它至少可以与 14.14 1914(Visual Studio 2017 版本 15.7)一起测试
为了进一步详细说明为什么缺少的重载似乎非常重要,我敢打赌以下代码可以与您的编译器一起使用(我无法重现):
#include <utility> // std::pair
#include <map>
int main ()
std::map<int, int> mymap;
auto a1 = std::make_pair<const int, int>(1,2);
mymap.insert(std::make_pair<const int,int>(3,4));
mymap.emplace(3,4);
mymap.insert(a1);
mymap.insert(5,6); //no error message
【讨论】:
以上(原始)代码应该适用于 C++11 恕我直言。 该代码适用于 MSVC2012(Qt 5.4.2) 和 c++11 编译器(cplusplus.com/reference/utility/make_pair/?kw=make_pair)。 我很确定我们使用了std::pair<iterator, bool> insert( value_type&& value ); and According to CPP Reference this is a C++17 overload. And according to CPP Reference what seems to be the
std::pair` 改进,正如我提到的,2013 版本没有实现
@cd-00 我不明白如何,您链接了 std::make_pair
函数,但正如我所说,相关部分是 std::map::insert
的重载
@Superlokkus:这是map::insert(cplusplus.com/reference/map/map/insert)的介绍。我在旁边运行代码并选择c ++ 11,它可以工作。以上是关于Qt 5.14.2 在向 std::map 插入元素时出现语义问题的主要内容,如果未能解决你的问题,请参考以下文章