проблема с
template<typename T , typename Container >
bool isEqual(const Container &lhs,const Container &rhs ) {
bool ok = equal(begin(lhs), end(lhs), begin(rhs),
[](const T* lhs, const T* rhs){ return *lhs == * rhs; });
return ok;
}
заключается в том, что нет способа определить, что такое T
. Поскольку он не используется в параметрах функции, компилятор не знает, каким он должен быть, поэтому вы должны сообщить об этом при вызове функции. Тем не менее, вам на самом деле не нужно T
. Мы можем переписать лямбду, используя параметры auto
, которые превратят оператор вызова функции лямбды в шаблон. Это меняет код на
template<typename Container >
bool isEqual(const Container &lhs,const Container &rhs ) {
bool ok = equal(begin(lhs), end(lhs), begin(rhs),
[](const auto* lhs, const auto* rhs){ return *lhs == * rhs; });
return ok;
}
Что приводит вас к следующей проблеме. *lhs == * rhs
сравнивает объекты, используя operator ==
. Вы не определили operator ==
для Point
, поэтому он не будет компилироваться. Вам нужно изменить Point
на что-то вроде
class Point {
public:
Point(int x, int y):_x(x),_y(y) {}
bool operator ==(const Point& rhs) { return std::tie(_x, _y) == std::tie(rhs._x, rhs._y); }
private:
int _x;
int _y;
};
Значит, их действительно можно сравнить.
Обратите внимание, что если вы используете std::vector<Point>
вместо std::vector<Point *>
, тогда std::vector
предоставляет свои operator ==
, и вы можете сравнить два std::vector<Point>
, просто выполнив
std::vector<Point> v1;
// fill v1
std::vector<Point> v2
// fill v2
if (v1 == v2)
// vectors are equal.
Не похоже, что у вас есть std::vector<Point *>
, поэтому я рекомендую это решение.