我在我的项目中创建了2个自定义结构,每个结构都有一个std :: set。
struct Subject {
std::string name;
std::set<SubjectFrame> frames;
Subject(std::string subject_name);
void AddFrame(SubjectFrame &frame);
bool operator<(const Subject &rhs) const { return (name < rhs.name);}
bool operator==(const Subject &rhs) const { return (name == rhs.name);}
};
struct Dataset {
std::set<Subject> subjects;
std::map<int, std::vector<Subject> > classification_groups;
Dataset(const std::string ds_path);
void AddSubject(Subject &subject);
void GetDSFromFileSystem(const std::string dataset_path);
void GetClassificationGroups(int number_of_groups_to_create);
};
每次我想在我的画面框架中添加一些框架&#39;我称这个函数为:
void Dataset::AddSubject(Subject &subject) {
set<Subject>::iterator it = this->subjects.find(subject);
if (it != this->subjects.end()) {
for (Subject fr : this->subjects) {
it->AddFrame(fr);
}
} else this->subjects.insert(subject);
}
调用此函数:
void Subject::AddFrame(SubjectFrame &frame) {
set<SubjectFrame>::iterator it = this->frames.find(frame);
if (it != this->frames.end()) {
if (frame.l_eye_centroid.x != 0) {
it->r_eye_centroid = frame.r_eye_centroid;
it->l_eye_centroid = frame.l_eye_centroid;
}
if (frame.path != "") it->path = frame.path;
else return;
}
else this->frames.insert(frame);
}
因此,添加操作背后的逻辑是:我传递一个对象并检查是否已经在我的std :: set中有一个具有该名称的对象。如果是,我用我的参数对象所具有的信息更新现有对象,如果没有我插入对象,则更新已经注册的对象。
我在尝试编译程序时遇到此错误:
错误:没有可行的超载&#39; =&#39; it-&gt; r_eye_centroid = frame.r_eye_centroid;
错误:没有可行的超载&#39; =&#39; it-&gt; l_eye_centroid = frame.l_eye_centroid;
错误:没有可行的超载&#39; =&#39; if(frame.path!=&#34;&#34;)it-&gt; path = frame.path;
错误:会员功能&#39; AddFrame&#39;不可行:&#39;这个&#39;参数有类型 &#39; const Subject&#39;,但函数未标记为const IT-&GT; ADDFRAME(FR);
有人知道造成这些问题的原因是什么,以及如何解决这些问题?
答案 0 :(得分:5)
对于std :: set,iterator -s是const
,这是因为它们被用作set
中的密钥,不应修改它以避免严格弱排序中的任何不一致。
解决此问题的一种方法是制作您要修改的字段mutable
,但请确保您的set
订单中未使用该字段。