我正在尝试使用向量来导出类Employee
,但我得到了错误:
class Company : public Employee, public TesterEmployee, public DeveloperEmployee {
private:
std::vector<Employee*> _table;
public:
friend std::vector<Employee*>& operator+=(const Employee* emp) {
_table.push_back(emp->clone());
return *this;
}
};
错误是:
错误:
'std::vector<Employee*>& operator+=(const Employee*)'
必须具有类或枚举类型的参数
答案 0 :(得分:0)
+=
是二元运算符。功能
friend std::vector<Employee*>& operator+=(const Employee* emp) {
_table.push_back(emp->clone());
return *this;
}
定义了一个只能有一个参数的非成员函数。因此,它不能用在如下表达式中:
a += b;
您需要的是:
Company& operator+=(const Employee* emp) {
_table.push_back(emp->clone());
return *this;
}
答案 1 :(得分:0)
回答有关相同代码的其他问题(您删除了https://stackoverflow.com/questions/30717107/operator-overloading-in-my-class-with-error):
问以及问题:
error: invalid operands of types 'Company*' and 'DeveloperEmployee*' to binary 'operator+'|
这是什么意思?
这意味着您正在尝试用C ++编写Java / C#代码。不要那样做。
特别是你为了OOP而滥用OOP。 Company
不是Employee
(请参阅Liskov),而company + employee
没有意义。
丢失new
。
丢失基类。
可能会丢失基于clone
的动态值语义。
最后,您的问题是,您使用的operator+=
并未超载。
#include <vector>
#include <iostream>
struct Employee {
int getID() const { return _id; }
private:
int _id = generate_id();
static int generate_id() {
static int next = 0;
return ++next;
}
};
struct DeveloperEmployee : Employee {
DeveloperEmployee(std::string const& descr, std::string const& project)
: _description(descr), _project(project) { }
private:
std::string _description;
std::string _project;
friend std::ostream& operator<<(std::ostream& os, DeveloperEmployee const& de) {
return os << "id:" << de.getID() << " descr:'" << de._description << "' project:'" << de._project << "'";
}
};
class Company {
private:
std::vector<Employee> _table;
std::string _des;
public:
Company &operator+=(const Employee &emp) {
_table.push_back(emp);
return *this;
}
void setDescription(std::string des) { _des = des; }
};
int main() {
Company company;
DeveloperEmployee a("description", "project");
int id = a.getID();
std::cout << a << std::endl; // Developer ID = 2, project = hw5
company += a;
}