具有模板和优先级队列的功能

时间:2016-03-08 15:58:55

标签: c++ templates priority-queue

我正在尝试使用Fibonacci Heap和Priority Queue编写Dijkstra算法。所以我有一个Fibonacci Heap的类(结构)

template<class T>
struct Fib {
    ...
};

和一个功能

template <template <class> class T>
void dijkstra(...) {
    T<std::pair<double, int> > heap;
    ...
}

问题是:

dijkstra<Fib>(...);                 // OK
dijkstra<std::priority_queue>(...); // doesn't compile

为什么不编译,如何正确编写?

1 个答案:

答案 0 :(得分:2)

当您编写如下参数时:

template<class> class T

需要具有单个模板参数的类模板。 Fib是一个类模板,只需要T。但是,std::priority_queue不会使用单个模板参数。它需要三个,即使两个是默认的:

template<
    class T,
    class Container = std::vector<T>,
    class Compare = std::less<typename Container::value_type>
> class priority_queue;

如果您使用的是C ++ 11,则可以简单地增强dijkstra以获取任意类模板:

template<template<class...> class T>
//                     ^^^
void dijkstra(...) {

或者为std::priority_queue

写一个单模板参数别名
template <class T>
using vector_less_pq = std::priority_queue<T>;