在类中调用模板

Calling template in class

本文关键字:调用      更新时间:2023-10-16

我希望创建一个多个类可以使用的静态布尔模板函数。我使用此函数作为比较器对点向量进行排序。这是我到目前为止所做的:

类.h


class Point2D
{
protected:
int x;
int y;
public:
int getX();
int getY();
Point2D();
Point2D(int x, int y);
template< typename T>
T sortAscending(T a, T b )
{
return a.getX() < b.getX();
}

static bool sortAscending(Point2D a,  Point2D b);
}

主内.cpp

// my vector contains objects of Point2D that i wish to 
//sort according to the value of x coordinates.
sort(p2Vec.begin(),p2Vec.end(),Point2D::sortAscending);

给我错误:

错误:调用没有匹配函数 'sort(std::vector::iterator, std::vector::iterator, ('

有谁知道我做错了什么?

在这里使用 lambda 函数,如下所示:

std::sort(p2Vec.begin(),p2Vec.end(),
[](const Point2D & p1, const Point2D & p2) {
return Point2D::sortAscending( p1, p2); 
});

看这里

语法为:

std::sort(p2Vec.begin(), p2Vec.end(), &Point2D::sortAscending<Point2D>);

并要求该方法static

但最好在外面创建一个结构:

struct LessByGetX
{
template <typename T>
bool operator () (const T& lhs, const T& rhs) const
{
return lhs.getX() < rhs.getX();
}
};

并使用它:

std::sort(p2Vec.begin(), p2Vec.end(), LessByGetX{});

或者,您可以直接使用 lambda:

std::sort(p2Vec.begin(), p2Vec.end(), [](const T& lhs, const T& rhs)
{
return lhs.getX() < rhs.getX();
});