ошибка: нет подходящей функции для вызова 'swap' - PullRequest
0 голосов
/ 18 сентября 2018

Я пытаюсь отсортировать вектор cakeTypes по размеру их веса.Но получение ошибки в реализации сортировки.

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

class CakeType 
{
public:
    const unsigned int weight_;
    const unsigned int value_;

    CakeType(unsigned int weight = 0, unsigned int value = 0) :
        weight_(weight),
        value_(value)
    {}
};

bool compareCakes(const CakeType& cake1, const CakeType& cake2) {
    return cake1.weight_ < cake2.weight_;
}


unsigned long long maxDuffelBagValue(const std::vector<CakeType>& cakeTypes,
                                     unsigned int weightCapacity)
{
    // calculate the maximum value that we can carry
    unsigned cakeTypesSize = cakeTypes.size();
    unsigned long long valueCalculator[weightCapacity+1][cakeTypesSize+1];

    for (unsigned int i = 0; i<=weightCapacity+1; i++) {
        valueCalculator[i][0] = 0;
    }

    for (unsigned int i = 0; i<=cakeTypesSize+1; i++) {
        valueCalculator[0][i] = 0;
    }
    vector<CakeType> sortedCakeTypes(cakeTypes);


    sort(sortedCakeTypes.begin(), sortedCakeTypes.end(), compareCakes);
    return 0;
}

Это часть ошибки:

завершено с ненулевым кодом (1).

Inфайл включен из solution.cc:1:

В файл включен из / usr / include / c ++ / v1 / iostream: 38:
В файл включен из / usr / include / c ++ / v1 / ios:216:
В файле из / usr / include / c ++ / v1 / __ locale: 15:
В файле из / usr / include / c ++ / v1 / string: 439:
/ usr / include /c ++ / v1 / алгоритма: 3856: 17: ошибка: не соответствует функция для вызова 'swap'

            swap(*__first, *__last);

            ^~~~

Я пробовал это решение sort () -Нет соответствующей функции для вызова 'swap' , но это не та же проблема.

1 Ответ

0 голосов
/ 18 сентября 2018

Тип данных, который используется функцией swap в алгоритме sort, должен быть MoveAssignable, тогда вы можете выполнить операцию, как показано ниже

CakeType c1, c2;
c1 = move(c2); // <- move c2 to c1

Но в вашем случае CakeType имеет постоянные члены-данные. Вы можете присваивать значения постоянным элементам данных только в конструкторах. Код не может быть скомпилирован, потому что это ограничение не может генерировать оператор присваивания / копирования по умолчанию (присвоение константному члену недопустимо).

Удалите спецификатор const из определения класса, и код будет работать.

class CakeType 
{
public:
    unsigned int weight_;
    unsigned int value_;

    CakeType(unsigned int weight = 0, unsigned int value = 0) :
        weight_(weight),
        value_(value)
    {}
};
...