关于In template: no matching constructor for initialization of

下面的代码,大家经常使用,不回报错:

cpp 复制代码
std::map<int, int > map4;
map4[20]=40;

那下面的代码呢?

cpp 复制代码
struct Extent {

public:
    int end;

    explicit Extent( int n){
        end=n;
    }
    //Extent() : end(0) {}
    int logical_end() const { return end; } // 简化逻辑

};

int main() {
    Extent extent2(5);
    std::map<int, Extent> map3;
    map3[20]=extent2;
  }

clion编译前就会给提升In template: no matching constructor for initialization of 'Extent'

编译时会报错,candidate expects 1 argument, 0 provided。

感觉是缺一个无参构造函数,增加无参构造就好了。

实在不明白为什么。

最后经过 万能的chatGPT,才知道

在您提供的代码中,map3是一个std::map<int,

Extent>,即键是int类型,值是Extent类型的对象。当您尝试使用下标操作符map3[20]=extent2;来插入元素时,实际上这里发生了两件事:

查找键:首先,map会尝试查找键20。如果找不到,它会默认构造一个Extent对象作为默认值(即使这个默认值随后会被替换)。这就是问题所在。

赋值或插入:接着,如果找到了键20,则直接对该键对应的值进行赋值;如果没有找到,则在该位置插入新的键值对。

对于map4(类型为std::map<int,

int>),插入操作不涉及复杂的对象构造,因为其值类型是基本类型int,可以直接进行复制赋值,所以不会遇到构造函数匹配的问题。

而对于map3,由于Extent类定义了一个显式构造函数explicit Extent(int

n),而没有默认构造函数(即没有不带参数的构造函数),当std::map试图为键20默认构造一个Extent对象作为占位符时,就会找不到合适的构造函数来匹配,从而引发"no

matching constructor for initialization of 'Extent'"的错误。

首先,map会尝试查找键20。如果找不到,它会默认构造一个Extent对象作为默认值(即使这个默认值随后会被替换)。这就是问题所在。

基础不牢,地动山摇!

相关推荐
晚云与城27 分钟前
今日分享:C++ Stack和queue(栈与队列)
开发语言·c++
bikong71 小时前
一种高效绘制余晖波形的方法Qt/C++
数据库·c++·qt
深耕AI1 小时前
【MFC文档与视图结构:数据“仓库”与“橱窗”的梦幻联动 + 初始化“黑箱”大揭秘!】
c++·mfc
励志不掉头发的内向程序员2 小时前
STL库——二叉搜索树
开发语言·c++·学习
tan180°3 小时前
Boost搜索引擎 查找并去重(3)
linux·c++·后端·搜索引擎
阿昭L3 小时前
c++中获取随机数
开发语言·c++
3壹3 小时前
数据结构精讲:栈与队列实战指南
c语言·开发语言·数据结构·c++·算法
aaaweiaaaaaa4 小时前
c++基础学习(学习蓝桥杯 ros2有C基础可看)
c++·学习·蓝桥杯·lambda·ros2·智能指针·c++类
一拳一个呆瓜4 小时前
【MFC】对话框属性:字体 (Font Name) 和 大小 (Font Size)
c++·mfc
郝学胜-神的一滴4 小时前
基于OpenGL封装摄像机类:视图矩阵与透视矩阵的实现
c++·qt·线性代数·矩阵·游戏引擎·图形渲染