为什么要在结构而不是类中为priority_queue重载()运算符?

时间:2019-12-17 04:01:56

标签: c++ operator-overloading priority-queue

我想知道为什么以下重载是错误的。

class comparator{
    bool operator()(string& s1, string& s2) {
        return s1[0] < s2[0];
    }
};

int main()
{
    priority_queue<string, vector<string>, comparator> myqueue;
    myqueue.push("a");
    myqueue.push("bb");
    myqueue.push("ccc");
    return 0;
}

它给出了错误

operator() cannot access private member declared in class comparator.

当我使用“ struct”而不是“ class”时,它会起作用。

1 个答案:

答案 0 :(得分:2)

  

我想知道为什么以下重载是错误的。

因为用class关键字定义的类的默认访问说明符是private。您没有指定成员函数的访问说明符,因此使用默认值。

该错误消息向您说明无法访问私有成员。私有函数只能在类的范围内命名。由于您使用的模板未在类的范围内定义,因此无法使用私有成员函数。

struct关键字定义的类的默认访问说明符是public。可以从类定义之外命名公共函数,因此可以在这里使用。

  

为什么我应该在结构而不是类中为(priority_queue)重载()运算符?

您也可以使用class。但是随后您必须明确指定访问说明符。

P.S。默认的访问说明符是用关键字class定义的类和用关键字struct定义的类(也称为结构)之间的唯一区别。