带模板和优先级队列的函数
问题描述:
我正在试图用斐波那契堆和优先队列编写Dijkstra算法。所以,我对于斐波那契堆带模板和优先级队列的函数
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
为什么没有这样的编译,以及如何我正确写入?
答
当你写这样一个参数:
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(...) {
或写单-template参数别名std::priority_queue
:
template <class T>
using vector_less_pq = std::priority_queue<T>;
的std :: priority_queue本身就是一个模板,你有没有实例化对象将持有型的模板。 – Jonathan