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

C++ 为什么我应该在结构而不是类中重载优先级队列的()运算符?,c++,operator-overloading,priority-queue,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"); my

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

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;
}
当我使用“struct”而不是“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;
}
因为用
class
关键字定义的类的默认访问说明符是私有的。您没有指定成员函数的访问说明符,因此使用默认值

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

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

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

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

另外,默认访问说明符是使用关键字
class
定义的类与使用关键字
struct
定义的类(也称为structs)之间唯一的区别

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

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;
}
因为用
class
关键字定义的类的默认访问说明符是私有的。您没有指定成员函数的访问说明符,因此使用默认值

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

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

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

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


另外,默认访问说明符是使用关键字
class
定义的类与使用关键字
struct
定义的类(也称为structs)之间唯一的区别。

struct
class
基本相同,默认情况下,类中只有成员是私有的,默认情况下,在结构中为public。如果添加公共访问修饰符,则使用类将起作用:
struct
class
基本相同,只有成员在类中默认为私有,在结构中默认为公共。如果添加公共访问修饰符,则可以使用类: