Loading... > 英文名:Template Template Parameters。就是:让模板参数本身成为模板。 C++17才支持 1. int:类型,不是一个类,只是一个简单类型/内部类型 2. vector,list:是C++标准库中的容器,类模板(类名),vector<int>或者list<double>就属于模板被实例化了的参数,称呼为类型(类类型)。 3. 创建myclass的类模板,成员变量myc,是个容器 [https://stackoverflow.com/questions/70936816/c-template-compile-failed](https://stackoverflow.com/questions/70936816/c-template-compile-failed) ```cpp #include <iostream> #include <vector> #include <list> using namespace std; //T:类型模板参数,代表容器中元素类型。 //Container:代表的不是一个类型(不能是一个类型模板参数),而是一个类模板(类名) //Container,不叫做类型模板参数,而叫做 模板 模板参数,表示这个模板参数本身又是一个模板。 template < typename T, //typename Container = std::vector //不能这么写 这么些会造成编译报错 因为std::vector 不是类型 是模板类型 template <class> class Container = std::vector //Container是一个类模板,这就是一个模板模板参数,写法比较固定,这里的名字叫Container,叫U也可以。 //template <typename W> typename Container = std::vector //一般别用这种写法,也要理解这种[模板模板参数]其他写法,W可以省略,Container如果myclass类模板中不使用,也可以省略,从而出现了typename后面直接接=的写法。 > class myclass { public: Container<T> myc;//第一个参数T会作为第二个参数Container实例化的参数 public: void func(); myclass() //构造函数 { for (int i = 0; i < 10; ++i) { myc.push_back(i); //这几行代码是否正确取决于实例化该类模板时所提供的模板参数类型。 } } }; //在类外实现 template < typename T, template <typename W> typename Container /*= std::vector 不能这么写 会编译报错*/ > void myclass<T, Container>::func() { cout << "good!" << endl; } int main() { //错误 C3201 类模板“std::list”的模板参数列表与模板参数“Container”的模板参数列表不匹配 myclass<int, vector> mylistobj2; //double是容器中的元素类型,list是容器类型 mylistobj2.func(); return 0; } ``` 名字的由来:Container本身又是一个模板 Container,不叫做类型模板参数,而叫做 模板 模板参数,表示这个模板参数本身又是一个模板。 最后修改:2025 年 06 月 30 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏