操作数<传递对象不匹配
No match for operand< passing objects
我有两个 classes,一个是 Obj,当我计算集合的中位数时,另一个应该做一些运算符重载
我也将运算符<放在第二个class中,(其中我有第二个class对象的向量,并试图将对象传递给main以使用操作数。但是它继续给我 no match for operand<
我的第一个 class:
template<typename T>
class Obj {
private:
typedef vector <T> myins;
myins insieme;
public:
Obj() {}
void Add(const T& o) {
insieme.push_back(o);
}
void Remove() {
insieme.pop_back();
}
int Mediana() {
sort(insieme.begin(), insieme.end());
typename myins::const_iterator iter;
typename myins::const_iterator iter1;
double mediana = 0, result = 0;
int risultato = 0;
if (insieme.size() % 2 != 0) {
mediana = (insieme.size() + 1) ;
mediana /= 2;
result = round(mediana);
iter = insieme.begin()+result-1;
risultato = *iter;
}
else {
mediana = round(insieme.size()/2) ;
iter = insieme.begin()+mediana-1;
double mediana1 = mediana +1;
iter1 = insieme.begin()+mediana1-1;
risultato = round (*iter+*iter1);
risultato /= 2;
}
return (risultato);
}
};
第二个class:
template<typename T>
class ListaObj {
private:
vector<T> myobjs;
public:
ListaObj() {}
void AddObj(T& ob) {
myobjs.push_back(ob);
}
inline T& GetObj( int i ) {
return myobjs[i];
}
friend bool operator<(const T& o1, const T& o2) {
if ( o1.Mediana() < o2.Mediana() ) return true;
else
return false;
}
};
还有我的主要:
int main() {
Obj<int> o1;
Obj<int> o2;
ListaObj<Obj<int>> list;
o1.Add(2);
o1.Add(3);
o1.Add(3);
o1.Add(5);
o1.Add(7);
o1.Add(10);
o2.Add(1);
o2.Add(2);
o2.Add(3);
list.AddObj(o1);
list.AddObj(o2);
auto obj1 = list.GetObj(0);
auto obj2 = list.GetObj(1);
cout << "Mediana o1: "<<o1.Mediana() << endl;
cout << "Mediana o2: "<<o2.Mediana() << endl;
bool tr = obj1 < obj2;
if (tr) {
cout << "Mediana di o1 minore di o2";
}
else
cout << "o2 minore di o1";
return 0;
}
在主要的 cout Mediana 01 和 Mediana 02 之前,它完美地工作并给出了正确的结果,但在过载时,它给出:
|135|error: no match for 'operator<' (operand types are 'Obj' and 'Obj')|
我搜索并尝试了 2 个小时,但没有解决我的问题,我做错了什么?
谢谢
我需要对 return 执行运算符重载<(和其他),如果第一个 obj 的中位数 < 然后是第二个,使用两个 class 和一个 Objs
仔细阅读编译错误。
"less than" 运算符在 class ListaObj
中重载,而您尝试比较 obj1
和 obj2
,它们是 Obj
类型的两个对象。
我有两个 classes,一个是 Obj,当我计算集合的中位数时,另一个应该做一些运算符重载
我也将运算符<放在第二个class中,(其中我有第二个class对象的向量,并试图将对象传递给main以使用操作数。但是它继续给我 no match for operand<
我的第一个 class:
template<typename T>
class Obj {
private:
typedef vector <T> myins;
myins insieme;
public:
Obj() {}
void Add(const T& o) {
insieme.push_back(o);
}
void Remove() {
insieme.pop_back();
}
int Mediana() {
sort(insieme.begin(), insieme.end());
typename myins::const_iterator iter;
typename myins::const_iterator iter1;
double mediana = 0, result = 0;
int risultato = 0;
if (insieme.size() % 2 != 0) {
mediana = (insieme.size() + 1) ;
mediana /= 2;
result = round(mediana);
iter = insieme.begin()+result-1;
risultato = *iter;
}
else {
mediana = round(insieme.size()/2) ;
iter = insieme.begin()+mediana-1;
double mediana1 = mediana +1;
iter1 = insieme.begin()+mediana1-1;
risultato = round (*iter+*iter1);
risultato /= 2;
}
return (risultato);
}
};
第二个class:
template<typename T>
class ListaObj {
private:
vector<T> myobjs;
public:
ListaObj() {}
void AddObj(T& ob) {
myobjs.push_back(ob);
}
inline T& GetObj( int i ) {
return myobjs[i];
}
friend bool operator<(const T& o1, const T& o2) {
if ( o1.Mediana() < o2.Mediana() ) return true;
else
return false;
}
};
还有我的主要:
int main() {
Obj<int> o1;
Obj<int> o2;
ListaObj<Obj<int>> list;
o1.Add(2);
o1.Add(3);
o1.Add(3);
o1.Add(5);
o1.Add(7);
o1.Add(10);
o2.Add(1);
o2.Add(2);
o2.Add(3);
list.AddObj(o1);
list.AddObj(o2);
auto obj1 = list.GetObj(0);
auto obj2 = list.GetObj(1);
cout << "Mediana o1: "<<o1.Mediana() << endl;
cout << "Mediana o2: "<<o2.Mediana() << endl;
bool tr = obj1 < obj2;
if (tr) {
cout << "Mediana di o1 minore di o2";
}
else
cout << "o2 minore di o1";
return 0;
}
在主要的 cout Mediana 01 和 Mediana 02 之前,它完美地工作并给出了正确的结果,但在过载时,它给出:
|135|error: no match for 'operator<' (operand types are 'Obj' and 'Obj')|
我搜索并尝试了 2 个小时,但没有解决我的问题,我做错了什么? 谢谢
我需要对 return 执行运算符重载<(和其他),如果第一个 obj 的中位数 < 然后是第二个,使用两个 class 和一个 Objs
仔细阅读编译错误。
"less than" 运算符在 class ListaObj
中重载,而您尝试比较 obj1
和 obj2
,它们是 Obj
类型的两个对象。