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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么我应该在结构而不是类中为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.

当我使用“结构”而不是“类”时,它起作用。

答案

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

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

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

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

为什么我应该在结构而不是类中重载优先级队列的()运算符?

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

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

以上是关于为什么我应该在结构而不是类中为priority_queue重载()运算符?的主要内容,如果未能解决你的问题,请参考以下文章

什么时候应该在 C# 中使用结构而不是类?

IBOutlet 在 IBDesignable 类中为零

我啥时候应该使用结构而不是类?

如何在抽象父类中为实现打字稿制作泛型方法?

专用结构/类中未识别的数据成员

在模板基类中为继承类中的可选覆盖生成虚拟方法