首页 > 解决方案 > 将设置传递给模板化函数

问题描述

这是我的完整工作代码

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>

代码有什么问题?

标签: c++templatesset

解决方案


为了能够创建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 );
}

推荐阅读