模板中的最大值和最小值错误 class
Error with max and min in a template class
我写了一个名为 Triple
的模板 class 来获取 type T
的 3 个对象,我有三个函数来获取这 3 个对象的最小值、最大值和中值。
我正在使用 STL 中的 min
和 max
函数来完成此操作。
我必须将所有方法设为 const 才能使 max 和 min 正常工作,并且它确实可以正常工作,但后来我创建了一个名为 Employee
的 class,这个 class 有 2函数 getSalary()
和 getName()
,我已经重载了 < >
运算符,所以我可以在我的模板中使用这个 class。
这是我 运行 遇到问题的地方,编译器抱怨:const std::string Employee::getName(void)' : cannot convert 'this' pointer from 'const Employee' 到 'Employee &'
我已经尝试将员工 class 中的所有内容都更改为 const 但没有成功,而且我无法让三元组 class 工作,除非一切都是 const。
我哪里出错了?
Triple.h
#ifndef TRIPLE_H
#define TRIPLE_H
template<class T>
class Triple{
public:
Triple();
Triple(const T fE, const T sE, const T tE);
const T maximum();
const T minimum();
const T median();
private:
const T firstElement;
const T secondElement;
const T thirdElement;
};
#endif
Triple.CPP
#include "Triple.h"
#include <algorithm>
using std::max;
using std::min;
template<class T>
Triple<T>::Triple(){
}
template<class T>
Triple<T>::Triple(const T fE, const T sE, const T tE)
:firstElement(fE), secondElement(sE), thirdElement(tE){
}
template<class T>
const T Triple<T>::maximum(){
return max(max(firstElement, secondElement), thirdElement);
}
template<class T>
const T Triple<T>::minimum(){
return min(min(firstElement, secondElement), thirdElement);
}
template<class T>
const T Triple<T>::median(){
return max(min(firstElement, secondElement), min(max(firstElement, secondElement), thirdElement));
}
Employee.h
#include <string>
#include <iostream>
using std::ostream;
using std::string;
class Employee{
public:
Employee();
Employee(string, double);
const string getName();
double getSalary();
bool Employee::operator<(const Employee &rop);
bool Employee::operator>(const Employee &rop);
private:
double salary;
string name;
};
Employee.cpp
#include "Employee.h"
Employee::Employee(){
}
Employee::Employee(string nameIn, double salaryIn)
:name(nameIn), salary(salaryIn) {
};
const string Employee::getName(){
return name;
}
double Employee::getSalary(){
return salary;
}
bool Employee::operator < (const Employee &rop)
{
return (salary < rop.salary);
}
bool Employee::operator >(const Employee &rop)
{
return (salary > rop.salary);
}
main.cpp
#include "Triple.h"
#include "Triple.cpp"
#include "Employee.h"
#include <iostream>
using std::cout;
using std::endl;
int main(){
Employee john("John", 70000);
Employee tom("Tom", 30000);
Employee mark("Mark", 10000);
Triple<int> oneTriplet(1, 2, 3);
Triple<char> twoTriplet('A', 'B', 'C');
Triple<Employee> threeTriplet(john, tom, mark);
cout << oneTriplet.maximum() << endl;
cout << oneTriplet.minimum() << endl;
cout << oneTriplet.median() << endl;
cout << twoTriplet.maximum() << endl;
cout << twoTriplet.minimum() << endl;
cout << twoTriplet.median() << endl;
cout << threeTriplet.maximum().getName() << endl;
cout << threeTriplet.minimum().getName() << endl;
system("pause");
return(0);
}
threeTriplet.maximum()
return 是一个 const Employee
对象。
然后你在它上面调用 Employee::getName()
(没有标记为 const
)函数,所以编译器会抱怨,因为你不允许在 const
对象上调用非常量成员函数。
要么标记 getName() const
(当您的函数不需要修改对象时总是一个好主意),或者只标记 Triple<T>::median()
、Triple<T>::minimum()
中的 return , Triple<T>::maximum()
按非常量值。
尝试将 const 添加到 <> 重载运算符中:
在Employee.cpp中:
bool Employee::operator < (const Employee &rop) const
{
return (salary < rop.salary);
}
bool Employee::operator < (const Employee &rop) const
{
return (salary < rop.salary);
}
在Employee.h
bool Employee::operator<(const Employee &rop)const;
bool Employee::operator>(const Employee &rop)const;
我写了一个名为 Triple
的模板 class 来获取 type T
的 3 个对象,我有三个函数来获取这 3 个对象的最小值、最大值和中值。
我正在使用 STL 中的 min
和 max
函数来完成此操作。
我必须将所有方法设为 const 才能使 max 和 min 正常工作,并且它确实可以正常工作,但后来我创建了一个名为 Employee
的 class,这个 class 有 2函数 getSalary()
和 getName()
,我已经重载了 < >
运算符,所以我可以在我的模板中使用这个 class。
这是我 运行 遇到问题的地方,编译器抱怨:const std::string Employee::getName(void)' : cannot convert 'this' pointer from 'const Employee' 到 'Employee &'
我已经尝试将员工 class 中的所有内容都更改为 const 但没有成功,而且我无法让三元组 class 工作,除非一切都是 const。
我哪里出错了?
Triple.h
#ifndef TRIPLE_H
#define TRIPLE_H
template<class T>
class Triple{
public:
Triple();
Triple(const T fE, const T sE, const T tE);
const T maximum();
const T minimum();
const T median();
private:
const T firstElement;
const T secondElement;
const T thirdElement;
};
#endif
Triple.CPP
#include "Triple.h"
#include <algorithm>
using std::max;
using std::min;
template<class T>
Triple<T>::Triple(){
}
template<class T>
Triple<T>::Triple(const T fE, const T sE, const T tE)
:firstElement(fE), secondElement(sE), thirdElement(tE){
}
template<class T>
const T Triple<T>::maximum(){
return max(max(firstElement, secondElement), thirdElement);
}
template<class T>
const T Triple<T>::minimum(){
return min(min(firstElement, secondElement), thirdElement);
}
template<class T>
const T Triple<T>::median(){
return max(min(firstElement, secondElement), min(max(firstElement, secondElement), thirdElement));
}
Employee.h
#include <string>
#include <iostream>
using std::ostream;
using std::string;
class Employee{
public:
Employee();
Employee(string, double);
const string getName();
double getSalary();
bool Employee::operator<(const Employee &rop);
bool Employee::operator>(const Employee &rop);
private:
double salary;
string name;
};
Employee.cpp
#include "Employee.h"
Employee::Employee(){
}
Employee::Employee(string nameIn, double salaryIn)
:name(nameIn), salary(salaryIn) {
};
const string Employee::getName(){
return name;
}
double Employee::getSalary(){
return salary;
}
bool Employee::operator < (const Employee &rop)
{
return (salary < rop.salary);
}
bool Employee::operator >(const Employee &rop)
{
return (salary > rop.salary);
}
main.cpp
#include "Triple.h"
#include "Triple.cpp"
#include "Employee.h"
#include <iostream>
using std::cout;
using std::endl;
int main(){
Employee john("John", 70000);
Employee tom("Tom", 30000);
Employee mark("Mark", 10000);
Triple<int> oneTriplet(1, 2, 3);
Triple<char> twoTriplet('A', 'B', 'C');
Triple<Employee> threeTriplet(john, tom, mark);
cout << oneTriplet.maximum() << endl;
cout << oneTriplet.minimum() << endl;
cout << oneTriplet.median() << endl;
cout << twoTriplet.maximum() << endl;
cout << twoTriplet.minimum() << endl;
cout << twoTriplet.median() << endl;
cout << threeTriplet.maximum().getName() << endl;
cout << threeTriplet.minimum().getName() << endl;
system("pause");
return(0);
}
threeTriplet.maximum()
return 是一个 const Employee
对象。
然后你在它上面调用 Employee::getName()
(没有标记为 const
)函数,所以编译器会抱怨,因为你不允许在 const
对象上调用非常量成员函数。
要么标记 getName() const
(当您的函数不需要修改对象时总是一个好主意),或者只标记 Triple<T>::median()
、Triple<T>::minimum()
中的 return , Triple<T>::maximum()
按非常量值。
尝试将 const 添加到 <> 重载运算符中:
在Employee.cpp中:
bool Employee::operator < (const Employee &rop) const
{
return (salary < rop.salary);
}
bool Employee::operator < (const Employee &rop) const
{
return (salary < rop.salary);
}
在Employee.h
bool Employee::operator<(const Employee &rop)const;
bool Employee::operator>(const Employee &rop)const;