You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++98中std::priority_queue自定义比较器编译错误问题

在C++98中使用std::priority_queue的类型错误问题

你在C++98中尝试创建std::priority_queue变量的代码如下:

struct
{
    bool operator()(std::vector<int> v1, std::vector<int> v2){return (v1[2] + v1[3]) > (v2[2] + v2[3]);};
} queueCompare;

std::priority_queue< std::vector<int>, std::vector< std::vector<int> >, queueCompare > queue;

编译器报错:

expected a type, got `queueCompare'


错误原因

std::priority_queue的第三个模板参数要求传入类型,但你写的queueCompare是一个结构体的实例对象,不是类型。而且你定义的是匿名结构体,本身没有可直接引用的类型名称,所以编译器无法识别它作为模板参数。

解决方法

方法一:给结构体命名(推荐)

给匿名结构体加上名称,用类型名作为模板参数,再在构造队列时传入该类型的实例:

struct QueueCompare
{
    bool operator()(std::vector<int> v1, std::vector<int> v2)
    {
        return (v1[2] + v1[3]) > (v2[2] + v2[3]);
    }
};

// 第三个参数传入类型QueueCompare,构造时传入该类型的实例
std::priority_queue<std::vector<int>, std::vector<std::vector<int>>, QueueCompare> queue(QueueCompare());

方法二:使用函数指针(不推荐)

如果不想定义具名结构体,可以把比较逻辑改成普通函数,用函数指针类型作为模板参数:

bool queueCompare(std::vector<int> v1, std::vector<int> v2)
{
    return (v1[2] + v1[3]) > (v2[2] + v2[3]);
}

// 第三个参数是函数指针类型,构造时传入函数地址
std::priority_queue<std::vector<int>, std::vector<std::vector<int>>, bool(*)(std::vector<int>, std::vector<int>)> queue(&queueCompare);

方法一的仿函数实现性能更优,编译器能更好地做内联优化,是C++中自定义优先级队列比较规则的常规做法。


内容的提问来源于stack exchange,提问作者zeregzesis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 12:23:22