你好堆栈溢出我从stl设置有问题,我的问题是:
输入:
3
2,2,3
American Beauty#2002
Iron Man#2012
Interstellar#2014
Iron Man#2012
Inception#2010
Forrest Gump#1994
Iron Man#2012
SetTask2.h:
#pragma once
#include <set>
#include <vector>
#include <iostream>
#include <string>
#include <fstream>
#include <iterator>
#include <algorithm>
using namespace std;
struct Movie {
string movieName;
int movieYear;
};
bool operator<(const Movie& m1, Movie& m2);
void SetTask2();
SetTask2.cpp:
#include "SetTask2.h"
bool operator<(const Movie& m1, Movie& m2) {
return m1.movieYear <= m2.movieYear;
}
void SetTask2() {
ifstream in("SetTask2.in");
int numberOfPersons;
in >> numberOfPersons;
vector<set<Movie>> preferences;
string prefNumberS;
in >> prefNumberS;
for (int i = 0; i < prefNumberS.size(); i++) {
if (prefNumberS[i] != ',') {
int number = (int)prefNumberS[i] - 48;
string mName;
string mYear;
Movie m;
set<Movie> s;
for (int j = 0; j < number; j++)
{
getline(in, mName, '#');
getline(in, mYear, '\n');
m.movieName = mName;
m.movieYear = stoi(mYear);
s.insert(m);
preferences.push_back(s);
}
}
}
}
Main.cpp的:
#include "SetTask2.h"
using namespace std;
int main()
{
SetTask2(); // Set : Task 2
return 0;
}
然后我收到此错误:
错误C2679二进制&#39;&lt;&#39;:找不到带有&#39; const Movie&#39;类型的右手操作数的运算符(或者没有可接受的转换)
你能告诉我为什么吗?
答案 0 :(得分:1)
错误C2679二进制'&lt;':找不到运算符,它接受'const Movie'类型的右手操作数(或者没有可接受的转换)
您的operator<
仅针对左侧 const Movie&
定义,您需要对其进行修改以制作右侧操作数{ {1}}。
我注意到使用const
覆盖的数字<=
运算符可能会在排序时引入意外行为。如果您打算按年度对电影进行排序,请返回<
,而不是m1.year < m2.year
。
m1.year <= m2.year
此外,请勿在头文件中使用bool operator < (const Movie& left, const Movie& right) {
return left.movieYear < right.movieYear;
}
。它会导致头文件的使用者受到范围污染,并可能引入命名冲突。如果您查看最终的using namespace
翻译单元,您会看到您有两次Main.cpp
语句。