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

Why I should overload the () operator for priority_queue in a struct instead of a class?

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

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" 时,它起作用了。

I am wondering why the following overloading is wrong.

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

错误消息向您说明无法访问私有成员。私有函数只能在 class 范围内命名。由于你使用的模板没有定义在class的范围内,所以不能使用私有成员函数。

使用 struct 关键字定义的 class 的默认访问说明符是 public。 Public 函数可以从 class 定义之外命名,所以它在这里有效。

Why I should overload the () operator for priority_queue in a struct instead of a class?

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

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