没有用于调用“std::less<int>::less(const int&, const int&)”的匹配函数

Sta*_*ilo 3 c++ templates class

我试着写:

#include <functional>

template<class T, class func = std::less<T>>
class Car {
public:
    void check(const T& x, const T& y) {
        func(x, y);            //.... << problem
    }
};


int main() {
    Car<int> car;
    car.check(6, 6);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我在这里的意思是它会识别通常的<for int,但它说明了我标记的位置:

没有用于调用“std::less::less(const int&, const int&)”的匹配函数

但是,如果我创建了一个Car自定义的,func那么它就可以工作了……我该如何解决这个问题?

Nat*_*ica 6

你的问题是你需要一个func因为std::less<T>是函子(即类类型)而不是函数类型的实例。当你有

func(x, y);
Run Code Online (Sandbox Code Playgroud)

您实际上尝试构造一个未命名的std::less<T>withxy作为构造函数的参数。这就是为什么你得到

没有用于调用“std::less::less(const int&, const int&)”的匹配函数

就像std::less::less(const int&, const int&)构造函数调用一样。

你可以看到它是这样工作的:

#include <functional>

template<class T, class func = std::less<T>>
class Car {
    func f; 
public:
    void check(const int& x, const int& y) {
        f(x, y);
        // or
        func()(x, y); // thanks to Lightness Races in Orbit http://stackoverflow.com/users/560648/lightness-races-in-orbit
    }
};


int main() {
    Car<int> car;
    car.check(6, 6);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Live Example