c++ - 将设置传递给模板化函数
问题描述
这是我的完整工作代码
class Point2D
{
protected:
int x, y;
public:
Point2D(int x_, int y_) : x(x_), y(y_)
{
}
int getX() const
{
return x;
}
int getY() const
{
return y;
}
bool operator< (const Point2D & pointObj) const
{
if(x == pointObj.getX() && y == pointObj.getY())
return false;
return pointObj.getX() == x ? true : x < pointObj.getX();
}
};
template<typename T, typename U>
void printSet(const set<T>& setToPrint)
{
set<T, U> pSet;
for(typename set<T>::iterator it = setToPrint.begin(); it != setToPrint.end(); it++)
{
pSet.insert(*it);
}
for(typename set<T,U>::iterator it = pSet.begin(); it != pSet.end(); it++)
{
//here print the element
}
}
int main()
{
set<Point2D> setP2;
setP2.insert(Point2D(1,3));
setP2.insert(Point2D(3,2));
int i = 1;
if(i==1)
{
printSet<Point2D, std::less<Point2D > >(setP2);
i++;
}
if(i==2)
{
printSet<Point2D, std::greater<Point2D > >(setP2);
}
}
它从模板代码中产生了一堆错误,但我认为下面是主要错误
/usr/include/c++/5/bits/stl_function.h:377:20: 错误:'operator>' 不匹配(操作数类型为'const Point2D' 和'const Point2D')/usr/include/c++/5 /bits/stl_function.h:377:20:注意:'const Point2D' 不是从 'const std::pair<_T1, _T2>' 派生的</p>
代码有什么问题?
解决方案
为了能够创建std::set<Point2D, std::greater<Point2D>>
,你需要operator>
在两个对象之间实现类型Point2D
。
在类中添加类似的成员函数operator<
来解决问题。
改进建议
该operator<
功能可以简化为用户较少的比较操作。
bool operator< (const Point2D & pointObj) const
{
if ( x != pointObj.x )
{
return ( x < pointObj.x );
}
return ( y < pointObj.y );
}
该operato>
功能可以类似地实现为:
bool operator> (const Point2D & pointObj) const
{
if ( x != pointObj.x )
{
return ( x > pointObj.x );
}
return ( y > pointObj.y );
}
推荐阅读
- puppet - Hiera 5 命令无法显示所需的输出
- javascript - While 循环在不应该的情况下仍然触发
- java - 如何在Activity中调用带参数的方法?
- javascript - 当mongoose模型没有被req.params.id删除时,如何修复它的deleteOne()函数?
- angular - 如何在Angular 6中的(角度材料设计)中设置活动选项卡
- excel - 在没有公式的情况下隐藏excel中的特定行
- javascript - 如果不是输入,则事件目标的名称未定义
- php - 发送带有 php 链接的短信
- node.js - package-lock.json 包需求漏洞 (npm)
- javascript - 如何使用 typscript 从字体文件中获取实际字体名称