В чем проблема с оператором + перегрузка? - PullRequest
0 голосов
/ 29 марта 2019

У меня проблема, и у меня нет никаких идей о том, что не так.Мне нужно перегрузить оператор + для моего класса, чтобы я мог объединить два и более списков.

Ошибка

Xcode продолжает говорить:

Недопустимые операнды для двоичного выражения ('List *' и 'List *')

Мой код

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 ]

4 голосов
/ 29 марта 2019

Согласно [over.oper] / 6:

Операторная функция должна быть нестатической функцией-членом или не-функцией-членом, которая имеет по крайней мере один параметр, тип которого является классом, ссылкой на класс, перечислением или ссылкой на перечисление.

Следовательно, ваш operator+ недопустим, но компилятор не диагностировал это, потому что шаблон не был создан (стандарт позволяет, но не требует, чтобы компилятор выдавал диагностику в таком случае). При попытке добавить два указателя List<int>, в соответствии с [over.match.oper] / 1:

Если ни один операнд оператора в выражении не имеет типа, который является классом или перечислением, оператор предполагается встроенным оператором ...

Следовательно, компилятор не создал экземпляр вашего шаблона operator+, а вместо этого просто выдал ошибку, поскольку встроенный оператор + не может работать с двумя указателями.

Вам не нужно перегружать какие-либо операторы для объединения списков. Вместо этого вы можете просто написать обычную функцию.

0 голосов
/ 29 марта 2019

Я нахожу решение, изменив оператор + операнды из Списка * на просто Список:

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;

Спасибо всем за поддержку!

0 голосов
/ 29 марта 2019

Вы не можете перегрузить operator+, чтобы взять 2 указателя в качестве ввода или вернуть указатель в качестве вывода. Он должен принимать ссылки на объекты в качестве входных данных и возвращать новый объект по значению в качестве выходных данных (что требует, чтобы ваш класс поддерживал правило 3/5 , которого в настоящее время нет). Ваш текущий дизайн класса не подходит для поддержки операций конкатенации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...