错误:没有匹配功能可调用“交换”

时间:2018-09-18 06:15:18

标签: algorithm sorting c++11 quicksort swap

我正在尝试按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)退出。

     

在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 / algorithm:3856:17:错误:没有用于调用“交换”的匹配功能

     
            swap(*__first, *__last);

            ^~~~
  

我尝试了此解决方案sort() - No matching function for call to 'swap',但这不是同一个问题。

1 个答案:

答案 0 :(得分:3)

swap算法中的sort函数使用的数据类型必须为MoveAssignable,然后您才能执行以下操作

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

但是在您的情况下,CakeType具有const数据成员。您只能在构造函数中将值分配给const数据成员。无法编译代码,因为此限制无法生成默认的移动/复制分配运算符(向const成员的分配是非法的)。

从类定义中删除const说明符,代码将起作用。

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

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