为什么std :: sort无法找到合适的(静态成员)函数重载?

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在这种情况下找不到匹配的重载?

Evg*_*Evg 6

在你的代码中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)