运算符+重载有什么问题?

时间:2019-03-28 22:00:32

标签: c++ list operator-overloading

我遇到了问题,对什么地方不对也没有任何想法。我需要为类重载运算符+,以便可以合并两个或更多列表。

错误

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);
        }

3 个答案:

答案 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;

感谢大家的支持!