C++17下无法向std::map插入键值对:Edge构造函数匹配错误
解决std::map使用operator[]插入Edge时的构造函数错误
错误原因
当你调用std::map::operator[]时,如果指定的键不存在,map会自动默认构造一个对应的值类型对象(此处为Edge),再返回该对象的引用执行后续赋值。但你的Edge结构体仅定义了带两个int参数的构造函数,没有提供无参的默认构造函数,编译器找不到匹配的构造逻辑,因此抛出error: no matching constructor for initialization of 'Edge'错误。
解决方案
方案一:给Edge添加默认构造函数
利用C++11的=default语法显式声明默认构造函数,结合你已有的成员初始化,既能满足map的要求,又不破坏原有构造逻辑:
struct Edge { int v1{}; int v2{}; Edge() = default; // 显式生成默认构造函数 Edge (int v1, int v2) :v1{v1}, v2{v2} { } };
修改后operator[]就能正常创建默认的Edge对象,再完成赋值操作。
方案二:使用insert/emplace替代operator[]
如果不需要Edge支持默认构造,可以直接用insert或emplace插入已构造好的键值对,这两个方法不会触发默认构造逻辑,还能避免临时对象的额外开销:
int main() { std::map<std::string, Edge> mymap; // 使用insert插入临时对象 mymap.insert(std::make_pair("edge1", Edge(0,0))); // 使用emplace直接构造对象(更高效) mymap.emplace("edge2", 1, 1); // 直接传递Edge构造参数,map内部完成构造 return 0; }
内容的提问来源于stack exchange,提问作者tadm123
相关产品推荐
相关产品推荐

