c++ - 如何在三个模板参数中指定构造函数
问题描述
我必须在 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?
解决方案
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_t
是 std::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
这里并不需要这个特性,它也无助于编写更少的代码,我只是用它来命名有意义的名称。)
推荐阅读
- angular - 如何使用基于 webpack 的设置在 Angular 应用程序中加载外部库
- javascript - 为什么我应该调用 Function.prototype.apply.call(x, ...) 而不是 x.apply(...)?
- sql - 如何从 db 变量名中获取表名?(SQL)
- sql - 单个 where ... like 子句中的多行
- amazon-web-services - 在 AWS 状态语言中组合 `InputPath` 和 `Parameters`
- excel - Excel:以 KB、MB、GB、TB 等为单位更改单位大小的动态公式...自动
- javascript - 仅显示文本的光滑滑块
- android-source - 如何覆盖 Android.bp 中的默认值
- php - 如何获取具有相同列的多个数据?
- html - 如何使用视频元素在 html5 中播放直播视频?