sort() - 没有用于调用"交换"的匹配函数



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

测试.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
}

大多数有同样问题的人似乎把他们的算法变成了类成员,而不是静态成员,但这显然不是问题所在。

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

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

编译器引用swap,因为std::sort在内部使用函数交换。然而,作为成员函数run被声明为常数函数

void run() const;

则类本身的对象被视为常量对象,因此数据成员列表也是常量对象

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

因此,编译器试图用常量引用甚至不是引用的参数来调用swap,但找不到这样的函数。

最新更新