2016-03-08 62 views
0

我正在试图用斐波那契堆和优先队列编写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 

为什么没有这样的编译,以及如何我正确写入?

+0

的std :: priority_queue本身就是一个模板,你有没有实例化对象将持有型的模板。 – Jonathan

回答

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(...) { 

或写单-template参数别名std::priority_queue

template <class T> 
using vector_less_pq = std::priority_queue<T>;