Tim*_*yer 2 c++ stl overloading visual-c++
我有一个类,提供可以使用的自定义静态比较器std::sort.以下编译就好了(剥离到最小代码示例):
#include <vector>
#include <string>
#include <algorithm>
class StringUtils
{
public:
static bool customStringCompare(const std::string&, const std::string&) { return true; }
};
void test()
{
std::vector<std::string> testList;
std::sort(testList.begin(), testList.end(), StringUtils::customStringCompare);
}
Run Code Online (Sandbox Code Playgroud)
现在,当我向StringUtils类添加一个重载时
static bool customStringCompare(const char*, const char*) { return true; }
Run Code Online (Sandbox Code Playgroud)
以下工作:
void test2()
{
std::string s1, s2;
StringUtils::customStringCompare(s1, s2);
}
Run Code Online (Sandbox Code Playgroud)
但是,std::sort上面的调用在MSVC 2015 Update 2中产生编译器错误C2672(未找到匹配的重载),C2780(预期2个参数 - 3支持),C2783("_Pr"的模板参数无法推断).
为什么std::sort在这种情况下找不到匹配的重载?
在你的代码中std::sort需要一个函数指针.那么编译器如何决定你想要的功能呢?IntelliSense显示以下错误:
无法确定哪些重载函数的实例
StringUtils::customStringCompare意
要使用重载,可以将比较器转换为函数对象:
struct Comparator {
bool operator()(const std::string&, const std::string&) const {
return true;
}
bool operator()(const char*, const char*) const {
return true;
}
};
void test() {
std::vector<std::string> testList;
std::sort(testList.begin(), testList.end(), Comparator{});
}
Run Code Online (Sandbox Code Playgroud)
或者,从C++ 14开始,您可以使用通用的lambda函数:
void test() {
std::vector<std::string> testList;
std::sort(testList.begin(), testList.end(),
[](const auto& s1, const auto& s2) {
return StringUtils::customStringCompare(s1, s2);
});
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
103 次 |
| 最近记录: |