为什么这个语句"priority_queue <pair<int,int>,vector<pair<int,int> >compare>pq;"在C++

Why this statement `priority_queue <pair<int,int>, vector<pair<int,int> >,compare>pq;` is an error in C++03 but correct in C++11?

本文关键字:gt int lt pair vector compare pq C++ queue 为什么 语句      更新时间:2023-10-16

以下代码片段声明了类型 pair<int,int> 的priority_queue,并使用类比较器并在 C++11 中更正,但在 C++03 中显示错误。原因是什么?

class compare
    {
    public:
        bool operator () (pair<int,int>&p1,pair<int,int>&p2)
        {
            return p1.second > p2.second;
        }
    };
    priority_queue <pair<int,int>, vector<pair<int,int> >,compare>pq;    

C++03 编译器显示:

  • 错误:"模板类 std::p riority_queue"的模板参数使用本地类型"main()::compare" priority_queue , 向量>,比较>pq;
  • 错误:尝试实例化"模板类 std::p riority_queue"

在 C++11 之前,不可能将本地类型作为模板参数传递。

这就是 C++03 编译器拒绝代码的原因。

如果您使用的是现代编译器,则可以将其翻转到 C++11 或 C++14 模式。
否则,你就不走运了。


[C++11: C.2.6]: 第14条:模板

[..]

14.6.4.2
改变:允许使用内部链接
调用函数的依赖函数 理由:过度约束,简化重载解决规则。
对原始特征的影响:有效的 C++ 2003 程序可能会得到与本国际标准不同的结果。