我正在尝试使用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
为什么不编译,如何正确编写?
答案 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>;