我花了大约一个小时试图弄清楚为什么当我尝试构建以下类(在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
,但找不到这样的函数。