【问题标题】:Function with template and Priority Queue带有模板和优先队列的函数
【发布时间】:2016-03-08 15:58:54
【问题描述】:

我正在尝试使用 Fibonacci Heap 和 Priority Queue 编写 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

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

【问题讨论】:

  • std::priority_queue 本身就是一个模板,您还没有使用它将持有的对象类型实例化模板。

标签: c++ templates priority-queue


【解决方案1】:

当你写一个像这样的参数时:

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>;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-14
    • 2022-03-15
    • 2021-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多