1. template template parameter + alias template(模板别名)
对 模板别名 做 偏特化或者特化是不可能的,#define
和 typedef
都不行。
左边的模板模板参数,在没有实例化的前提下,可以编译通过。
但是在实例化的时候XCls<MyString, vector> cl;
报错:
因为vector需要两个模板参数。尽管在常规写代码时vector<int>
只需要一个参数就够了,因为第二个模板参数是默认的。但是将vector
以模板模板参数传入时,编译器无法知道第二个模板参数有默认值,况且第二个模板参数是以第一个参数为参数的。
左边依然是模板模板参数形式,但是现在用alias template传入,using Vec = vector<T, allocator<T>>;
Vec是vector的模板别名,第二个参数是以第一个参数为参数,所以Vec只需要接受一个参数就够了,如MyString
等,左边的Container<T>
就是Vec
就是vector<T, allocator<T>>
。
注意: using 不得在function的body之内声明。
2. Types alias(类型别名)
本质上Types alias
和 typedef
没什么不同