sort() - 没有匹配函数来调用 'swap'

sort() - No matching function for call to 'swap'

刚花了大约一个小时试图弄清楚为什么当我尝试构建以下 class(在 XCode 中)时会收到 20 条 "Semantic issue - no matching function for call to 'swap'" 类型的错误消息。

test.h

#include <iostream>
#include <string>
#include <vector>


class Test{
    std::vector<std::string> list;

    void run() const;
    static bool algo(const std::string &str1, const std::string &str2);
};

test.cpp

#include "test.h"


void Test::run() const {
    std::sort( list.begin(), list.end(), algo );
}


bool Test::algo(const std::string &str1, const std::string &str2){
    // Compare and return bool
}

大多数遇到同样问题的人似乎都将他们的算法设为 class 成员而不是静态成员,但这显然不是这里的问题。

事实证明这是一个非常简单的问题,但不是很明显(并且错误消息也没有很好地帮助解决):

删除 run() 上的 const 声明 - 瞧。

编译器引用 swap 因为 std::sort 在内部使用函数交换。但是,由于成员函数 run 被声明为常量函数

void run() const;

那么class的对象本身就是一个常量对象,因此数据成员列表也是一个常量对象

std::vector<std::string> list;

所以编译器试图调用swap参数是常量引用甚至不是引用的函数,也找不到这样的函数。