我遇到了问题,对什么地方不对也没有任何想法。我需要为类重载运算符+
,以便可以合并两个或更多列表。
错误
Xcode一直在说:
对二进制表达式(“列表*”和“列表”)无效的操作数 *')
我的代码
template <typename Type> class List {
public:
Type data;
List *next;
void set_head(Type d) {
data = d;
next = nullptr;
}
void int_print() {
cout << data << endl;
}
};
template <typename Type>
List<Type>* operator+ (List<Type> *head1, List<Type> *head2) {
List<Type> *tmp = head1, *headf = nullptr, *tmpf = nullptr;
tmpf = list_create_head(tmp, tmp->data);
headf = tmpf;
tmp = tmp->next;
while (tmp != nullptr) {
tmpf = list_create_continue(tmpf, tmp->data);
tmp = tmp->next;
}
tmp = head2;
while (tmp != nullptr) {
tmpf = list_create_continue(tmpf, tmp->data);
tmp = tmp->next;
}
return headf;
}
//problem occurs here:
else if ((c == 8) * (bonus != nullptr)) {
List<int> *mem = nullptr;
mem = head + bonus; //Here!
free(bonus);
cout << "Result of merging: " << endl;
tmp = mem;
while (tmp != nullptr) {
tmp->int_print();
tmp = tmp->next;
}
free(mem);
}
答案 0 :(得分:4)
根据[over.oper] / 6:
运算符函数应为非静态成员函数或为具有以下内容的非成员函数: 至少一个类型为类,对类的引用,枚举或对一个对象的引用的参数 枚举。
因此,您的operator+
是非法的,但是编译器尚未诊断出此错误,因为模板尚未实例化(标准允许但不要求编译器在这种情况下发出诊断信息)。当您尝试添加两个List<int>
指针时,根据[over.match.oper] / 1:
如果表达式中没有运算符的操作数具有类或枚举类型,则该运算符 被假定为内置运算符...
因此,编译器没有实例化您的operator+
模板,而是仅仅发出了一个错误,因为内置+运算符无法对两个指针进行操作。
您不需要重载任何运算符即可合并列表。您可以简单地编写一个普通函数来代替它。
答案 1 :(得分:0)
您不能重载operator+
来接受2个指针作为输入,或返回一个指针作为输出。它需要将对象引用作为输入,并按值返回一个新对象作为输出(这要求您的类支持Rule of 3/5,而目前尚不支持)。您当前的班级设计不适合支持串联操作。
答案 2 :(得分:0)
我找到了解决方案,方法是将运算符+操作数从List *更改为简单的List:
template <typename Type>
List<Type>* operator+ (List<Type> head1, List<Type> head2) {
List<Type> *tmp = &head1, *headf = nullptr, *tmpf = nullptr;
tmpf = list_create_head(tmp, tmp->data);
headf = tmpf;
tmp = tmp->next;
while (tmp != nullptr) {
tmpf = list_create_continue(tmpf, tmp->data);
tmp = tmp->next;
}
tmp = &head2;
while (tmp != nullptr) {
tmpf = list_create_continue(tmpf, tmp->data);
tmp = tmp->next;
}
return headf;
}
问题在于编写这样的代码并不方便,但是无论如何:
mem = *head + *bonus;
感谢大家的支持!