C++类构造函数中unordered_map存Hex时出现无匹配构造函数错误
问题分析与解决方案
错误原因:std::unordered_map::operator[]要求值类型可默认构造
你遇到的no matching function for call to Hex::Hex()错误,根源在于std::unordered_map的operator[]的特殊行为:
当你使用hmap[counter]时,如果counter这个键不存在于map中,operator[]会自动调用值类型(这里是Hex)的默认构造函数,创建一个空的Hex对象插入到map中,再返回这个对象的引用供你赋值。但你的Hex结构体只定义了带三个int参数的构造函数,没有提供无参的默认构造函数,编译器找不到对应的构造方法,因此报错。
解决方法
方法1:使用insert或emplace替代operator[]
这两个方法不会触发默认构造,直接插入已构造好的Hex对象,或者原地构造对象:
- 插入已存在的
hexag1:hmap.insert(std::make_pair(counter, hexag1)); // 或者用初始化列表写法 hmap.insert({counter, hexag1}); - 原地构造
Hex对象(更高效):hmap.emplace(counter, 0, 1, -1); // 直接传入Hex构造函数的参数
方法2:给Hex添加默认构造函数
如果确实需要使用operator[],可以给Hex结构体添加默认构造函数:
struct Hex { int q, r, s; // 你的带参构造函数 Hex(int q_, int r_, int s_) : q(q_), r(r_), s(s_) {} // 添加默认构造函数 Hex() : q(0), r(0), s(0) {} // 或者用默认生成的版本(如果成员可以默认初始化) // Hex() = default; };
类内初始化问题的原理
你提到的Hex h = Hex(0,0,0);可行但Hex h(0,0,0);不可行,这是C++类内成员初始化的语法规则限制:
Hex h = Hex(0,0,0);属于拷贝初始化,符合类内成员初始化的语法要求(允许使用=或{}进行初始化),编译器会调用拷贝构造函数(默认生成的)完成初始化。Hex h(0,0,0);属于直接初始化,这种语法在类的成员声明时是不允许的,和Hex有没有对应构造函数无关,纯粹是语法规则不支持。你可以改用列表初始化替代:Hex h{0,0,0};,这是合法的。
内容的提问来源于stack exchange,提问作者big_foot2017
相关产品推荐
相关产品推荐

