首页 > 解决方案 > 如何在三个模板参数中指定构造函数

问题描述

我必须在 main 中定义 priority_queue 类。

int main(){
...
pri_queue_t<string, vector_t<string>, cmp> q3;
...
}

因此,我尝试制作如下所示的头文件。

template<typename T, class V, class O>  //the last argument is alphabet 'O'
class pri_queue_t{
public:
    pri_queue_t();  //constructor
    ....
}

template<typename T, class V, class O>
pri_queue_t<T, V, O>::pri_queue_t(){}  //body of constructor**

错误代码是

/home/mys/Desktop/stl_project/2_adp/main.cc: In function ‘int main()’:
/home/mys/Desktop/stl_project/2_adp/main.cc:147:43: error: ‘cmp’ was 
not declared in this scope; did you mean ‘bcmp’?
147 |     pri_queue_t<string, vector_t<string>, cmp> q3;
  |                                           ^~~
  |                                           bcmp
/home/mys/Desktop/stl_project/2_adp/main.cc:147:46: error: template 
argument 3 is invalid
147 |     pri_queue_t<string, vector_t<string>, cmp> q3; 

我的意思是 cmp 作为使 pri-queue 上升的选项。如何制作正确的构造函数?以及如何定义cmp?

标签: c++templatesconstructorarguments

解决方案


优先队列是

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

请注意第三个参数的默认值。如果您不知道还要放什么,那么默认值可能很好:

template<typename T, class V>  
class pri_queue_t{
public:
    pri_queue_t();  //constructor
    ....
}

template<typename T, class V>
pri_queue_t<T, V>::pri_queue_t(){}  //body of constructor**

我对 有点困惑//the last argument is alphabet 'O',因为 for 的第三个参数priority_queue是比较器,而不是“字母表”。无论如何,然后在main

int main(){
    pri_queue_t<string, vector_t<string>> q3;    
}

如果vector_tstd::vector,你也可以去掉第二个参数。

或者,您可以使用 priority_queue 中的默认值:

#include <queue>

template <typename T>
struct prio_queue_defaults {
    using container_type = typename std::priority_queue<T>::container_type;
    using value_compare = typename std::priority_queue<T>::value_compare;
};

template <typename T, 
          typename container = typename prio_queue_defaults<T>::container_type,
          typename compare = typename prio_queue_defaults<T>::value_compare>
struct my_prio_queue {
    std::priority_queue<T,container,compare> x;
};

int main() {
    my_prio_queue<int> y;
    my_prio_queue<int,std::vector<int>> z;
}

请注意,不需要为这个简单的示例编写构造函数,因为编译器生成的构造函数已经做了正确的事情。

prio_queue_defaults这里并不需要这个特性,它也无助于编写更少的代码,我只是用它来命名有意义的名称。)


推荐阅读