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&lt;iterator, bool&gt; insert( value_type&amp;&amp; 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&lt;iterator, bool&gt; insert( value_type&amp;&amp; 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 插入元素时出现语义问题的主要内容,如果未能解决你的问题,请参考以下文章

为啥我插入 std::map 失败?

根据插入时间从std :: map中删除元素

使用类方法插入 std::map

向 std::unordered_map 插入数据时访问冲突

一个跟踪插入顺序的 std::map ?

std::map的操作:插入修改删除和遍历