【问题标题】:Define Operator < in struct for 2 objects of another struct在结构中为另一个结构的 2 个对象定义运算符 <
【发布时间】:2013-04-17 21:41:33
【问题描述】:

我在 C++ 中遇到了一个小问题,希望您能帮助我。

我想定义一个结构 myPoint。这个结构应该能够比较来自类型点的两个对象(定义为对)。我希望 myPoint 的每个“实例”都能够自己比较两个点。这是我尝试编写的代码:

typedef pair<int,int> point;
struct myPoint{
    point p;
    inline bool operator<( point x, point y ){
    return !ccw(p,x,y);
}

所以每个 myPoint 在比较两个点 x,y 时都应该考虑他自己的点 p。 我得到的(翻译的)错误是

"error C2804:  Binary Operator '<' has too much Arguments/Parameters"

似乎在语法上可以使这个运算符只有一个点,我猜它会将一个点与一个 myPoint 进行比较,但这不是应该的。 问题的背景是我想使用预定义的排序函数对点向量进行排序,并且作为排序“函数”我想传递一个 myPoint 对象。

【问题讨论】:

  • 你的operator&lt; 根本没有意义——你怎么称呼它?此外,inline 是多余的,因为您的函数已经在类中定义,因此会自动inline

标签: c++ struct operator-keyword


【解决方案1】:

我认为(也许)您正在尝试做的是编写一个 仿函数

struct myPoint
{
    myPoint(point p) { this->p = p; }
    bool operator()(point x, point y) const
    {
        return !ccw(p,x,y);
    }
    point p;
};

仿函数可以作为第三个参数传递给 std::sort。

std::sort(vec.begin(), vec.end(), myPoint(p));

但我有疑问,假设 ccw 表示逆时针,我不认为这是一个有效的排序条件。

【讨论】:

  • 谢谢!对于快速而出色的答案,是的,这正是我试图做的。我读了某事。关于函子,对其进行编码,稍微改变了排序条件,现在它可以工作了;) - thx
【解决方案2】:

&lt; 仅使用一个参数定义重载。正如@KonradRudolph 所指出的,在这种情况下重载&lt; 是没有意义的,因为你不能在排序或任何事情中使用它

typedef pair<int,int> point;
struct myPoint{
    point p;
    bool smaller(const point &a, const point &b)
    {
        return !ccw(p,a,a)
    }
};

【讨论】:

    【解决方案3】:

    这个片段应该为你说明基本的事情:

    #include <utility>
    
    typedef std::pair<int,int> point;
    
    bool less(const point& p1, const point& p2)
    {
        return (p1.first < p2.first) ||
               ((p1.first == p2.first) && (p1.second == p2.second));
    }
    
    struct myPoint {
        point p;
        inline bool operator < (const point& p2) {
            return less(p, p2);
        }
    };
    
    int main()
    {
        return 0;
    }
    
    1. 您没有“关闭”运算符<.>
    2. 运算符
    3. 使用常量引用。

    【讨论】:

      猜你喜欢
      • 2015-05-24
      • 1970-01-01
      • 2022-01-02
      • 2014-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多