当我尝试构建以下类(在XCode中)时,花了大约一个小时试图找出为什么我会得到类型"Semantic issue - no matching function for call to 'swap'"
的20条错误消息。
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
}
大多数具有相同问题的人似乎都将他们的算法设为类成员而不是静态成员,但这显然不是问题所在。
答案 0 :(得分:20)
事实证明这是一个非常简单的问题,但发现并不是很明显(并且错误信息在帮助中也没有做得很好):
删除const
上的run()
声明 - voilá。
答案 1 :(得分:7)
编译器引用swap
因为std::sort
内部使用函数交换。但是,由于成员函数run
被声明为常量函数
void run() const;
那么类本身的对象被认为是一个常量对象,因此数据成员列表也是一个常量对象
std::vector<std::string> list;
因此编译器尝试使用常量引用的参数调用swap
,或者甚至不是引用,并且找不到这样的函数。