本文主要是介绍关于In template: no matching constructor for initialization of,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
下面的代码,大家经常使用,不回报错:
std::map<int, int > map4;
map4[20]=40;
那下面的代码呢?
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对象作为默认值(即使这个默认值随后会被替换)。这就是问题所在。
基础不牢,地动山摇!
这篇关于关于In template: no matching constructor for initialization of的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!