如何解决我收到错误:尝试在地图中放置对象时,没有用于初始化std :: pair的匹配构造函数
我尝试将自定义类型“锻炼”作为键,将Stroustrup的Graph_lib中的Open_polyline填充到地图中,没有任何运气。插入对象对我没有帮助。
地图中每对键和值都必须具有默认构造函数吗?
我得到的错误如下:
C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.25.28610\include\xmemory(671,76): error: no matching constructor for initialization of 'std::pair<const Exercise,Graph_lib::Open_polyline>'
::new (const_cast<void*>(static_cast<const volatile void*>(_Ptr))) _Objty(_STD forward<_Types>(_Args)...);
出现问题的功能:
graphs
是类型map<Exercise,Open_polyline>
的成员。
void WorkoutManager::updateGraphs(const bool state) {
if (state) {
for (auto w : loadedWorkouts) {
// Date indicates location on x axis.
// Each workout type gets its own graph.
// Each weight of workout indicates location on y axis.
int x_coord = stoi(date::format("%d",w.getDate().day()));
const set<ExerciseSet> exs = w.getResults();
int i {0}; // For Color picking.
for (ExerciseSet es : exs) {
// If exercise is found in map,point is added to existing graph.
if (graphs.find(es.type) != graphs.end()) {
graphs.find(es.type)->second.add(Point{x_coord,es.weight});
}
else {
// Exercise not found: creates new graph.
Open_polyline opl;
opl.set_style(Line_style::solid);
opl.set_color(Color(i));
opl.add(Point{x_coord,es.weight}); // Adds new point to graph.
graphs.emplace(es.type,opl); // <-- ERROR HERE!
}
++i;
}
}
for (auto it = graphs.begin(); it != graphs.end(); ++it) {
attach(it->second);
}
}
else {
// graphs.empty(); // <-- This also gives error.
}
}
Shape
从Open_polyline
继承的Graph.h
类。
这里只显示类及其构造函数。
class Shape
{ // deals with color and style,and holds sequence of lines
protected:
Shape()
{}
Shape(initializer_list<Point> lst)
{
for (Point p : lst)
add(p);
} // add() the Points to this Shape
...
};
struct Open_polyline : Shape
{ // open sequence of lines
using Shape::Shape;
...
};
Exercise
枚举和ExerciseSet
类:
#pragma once
#include <set>
#include <iostream>
#include <string>
#include <fstream>
#include "date.h" // Substitute for C++20 <chrono> which was not released yet.
using namespace std;
// Enumeration for exercises.
enum Exercise {
ArnoldPress,BenchPress,BenchPressIncline,BenchPressDecline,BicepsCurl,CableFlies,Deadlift,EZBarCurl,HammerCurl,LatPullDown,LatRaise,LegCurl,LegExt,LegPress,Pulley,ShoulderPress,Squat,StandingRow,TriBenchExt,TriPullDownBar,TriPullDownRope
};
// Class to give a exercise a corresponding weight.
struct ExerciseSet {
Exercise type;
int weight;
ExerciseSet(Exercise type,int weight) : type{type},weight{weight} {}
// Required to add this class to a set.
bool operator<(const ExerciseSet& r) const;
bool operator==(const ExerciseSet& r) const;
};
解决方法
根据对这篇文章的评论,问题在于 Open_polyline
类缺少复制构造函数。我自己解决这个问题的方法是使用指向 Open_polyline
对象的指针,将它们放置在 map
内。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。