std :: sort和compare-function与模板不起作用

时间:2015-01-16 13:19:23

标签: c++ sorting templates vector std

我想对任意类型的向量进行排序,因此我编写了以下代码:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

template<class T>
bool compare(T a, T b) {
    return a < b;
}

int main() {
    vector<int> v;
    v.push_back(3);
    v.push_back(4);
    v.push_back(2);
    v.push_back(1);

    sort(v.begin(), v.end(), compare);

    for (size_t i = 0; i < v.size(); i++) {
        cout << v.at(i) << " ";
    }

    return 0;
}

此代码未编译,并显示如下错误消息:

..\src\Test.cpp:22:34: error: no matching function for call to 'sort(std::vector<int>::iterator, std::vector<int>::iterator, <unresolved overloaded function type>)'
..\src\Test.cpp:22:34: note: candidates are:

... and more

当我使用具体类型实现compare-function时,它可以工作。 有人能用模板比较函数告诉我如何做到这一点吗?

2 个答案:

答案 0 :(得分:8)

您需要指定所需的专业化:

sort(v.begin(), v.end(), compare<int>);

Live on Coliru

答案 1 :(得分:6)

compare不是函数,它是一个可用于生成函数的函数模板,例如compare<int>compare<long>

因此,要将函数传递给sort,您需要命名函数模板的特化:

sort(v.begin(), v.end(), compare<int>);

或者,创建一个函数对象并传递:

struct Compare {
  template<typename T>
    bool operator()(T a, Tb) const { return a < b; }
};
sort(v.begin(), v.end(), Compare());

这个函数对象有一个成员函数模板,可以比较任何类型(比如你的compare)但是在将它传递给sort时你不需要引用特定的特殊化,你通过了类型为Compare的临时文件,在sort算法内,编译器将选择函数模板的正确特化。