为什么这个语句`priority_queue <pair <int,int>,vector <pair <int,int>&gt;,比较&gt; pq;`是C ++ 03中的错误,但在C ++ 11中是正确的吗?

时间:2016-03-15 18:22:40

标签: c++ templates

以下代码片段声明了类型为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编译器显示:

  • 错误:'template class std :: priority_queue'的模板参数使用本地类型'main():: compare'  priority_queue,vector&gt;,比较&gt; pq;
  • 错误:尝试实例化'template class std :: priority_queue'

1 个答案:

答案 0 :(得分:1)

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

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

如果您正在使用现代编译器,则可以将其翻转为C ++ 11或C ++ 14模式。
否则,你运气不好。

  

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

     

[..]

     

14.6.4.2
  更改:允许依赖调用具有内部链接的功能
  理由:过度约束,简化了重载决策规则   对原始功能的影响:有效的C ++ 2003程序可能会获得与此国际标准不同的结果。