在struct之外重载operator

时间:2017-05-25 16:17:54

标签: c++ struct set operator-overloading

我有一个struct,并希望实现其set指针。所以我尝试重载operator <来实现它。这里的一个限制是我无权访问结构定义中的重写代码。我怎么能在结构之外做呢?

这是我到目前为止所做的:

#include<iostream>
#include<set>
#include<vector>

using namespace std;

struct mystruct {
    int label;
    vector<mystruct *> neighbors;
};
bool operator < (mystruct * n1, mystruct* n2) {
    return n1 -> label < n2 -> label;
};
int main() {
    set<mystruct *> s;
    return 0;
}

错误消息是

  

错误:超载&#39;运营商&lt;&#39;必须至少有一个参数   类或枚举类型

1 个答案:

答案 0 :(得分:3)

的问题
bool operator < (mystruct * n1, mystruct* n2) {
    return n1 -> label < n2 -> label;
};

n1n2都是指针。即使它们是指向mystruct的指针,它们仍然只是指针,并且你不能为指针重载操作符,因为它们是内置的。修复它的最简单方法是使用引用来处理类似

的值。
bool operator < (const mystruct& n1, const mystruct7 n2) {
    return n.label < n2.label;
};

int main() {
    set<mystruct> s;
    return 0;
}

如果你不能这样做,那么你需要为std::set提供一个比较仿函数,并让它使用该函数而不是operator <。那看起来像是

struct mystruct_pointer_comp
{
    bool operator ()(mystruct * n1, mystruct* n2) {
        return n1->label < n2->label;
    };
}

int main() {
    set<mystruct *, mystruct_pointer_comp> s;
    return 0;
}