* 模板定义中智能引用名字\"Tp\",不能引用\"T\"和\"U\"\n};\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n类模板参数可以有缺省实参,给参数提供缺省实参的顺序是先右后左\ntemplate \u003Cclass T, int size = 16>\nclass MyStack;\n1\n2\n类模板名可以被用作一个类型指示符。当一个类模板名被用作另一个模板定义中的类型指示符时,必须指定完整的实参表\ntemplate \u003Ctypename T>\nclass Graphics {\n    T* next;  //* 在类模板自己的定义中不需要指定完整模板参数表\n};\n\ntemplate \u003Ctypename T>\nvoid show(Graphics\u003CT>& g)\n{\n    Graphics\u003CT>* pg = &g;  //* 必须指定完整的模板参数表\n}\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n类模板实例化\n从通用的类模板定义中生成类的过程称为模板实例化\n\n//* T是一个形参,同类型的实参值被提供给该形参\n//* 指定的每个不同类型值都创建一个新类\ntemplate \u003Ctypename T>\nclass Graphics {\n    T m_value;\n};\n// 类实例化\n//* T被指定为int\nclass Graphics {\n    int m_value;\n};\n//* T被指定为double\nclass Graphics {\n    double m_value;\n};\n//* T被指定为string\nclass Graphics {\n    string m_value;\n};\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n类模板实例化分为显示实例化和隐士实例化\n\n显示实例化\ntemplate class Stack\u003Cint>; //将类模板实例化为一个处理int类型的Stack类\n1\n隐式实例化\nStack\u003Cchar> charStack; // 先实例化一个CharStack类(名字由编译器按规则生成),然后用CharStack char Stack;创建一个对象\nStack\u003Cint> intStack; // 实例化一个IntStack类,在调用IntStack intStack;创建一个对象\n1\n2\n类模板实例化的时机\n\n当使用了类模板实例的名字,并且上下文环境要求存在类的定义时\n对象类型是一个类模板实例,当对象被定义时。此点被称作类的实例化点\n一个指针或引用指向一个类模板实例,当检查这个指针或引用所指的对象时\n#include \u003Ciostream>\n\ntemplate \u003Ctypename T>\nclass Graphics {\n    // body\n};\n\nvoid func(Graphics\u003Cchar>);  // 函数声明,不需要实例化\n\nclass Rect {\n    Graphics\u003Cdouble>& rsd;  // 声明一个类模板引用,不需要实例化\n    Graphics\u003Cint>     si;   // si是Graphics类型的对象,需要实例化类模板\n};\n\nvoid func(Graphics\u003Cchar> p)\n{\n    // todo\n}\n\nint main(int argc, char** argv)\n{\n    Graphics\u003Cchar>* sc;  // 声明一个类模板指针,不需要实例化\n\n    func(*sc);  // 需要实例化,传递给函数func的是一个Graphics\u003Cchar>对象\n\n    auto iobj = sizeof(Graphics\u003Cstd::string>);  // 需要实例化,因为sizeof会计算Graphics\u003Cstring>对象的大小,\n                                                // 为了计算大小,编译器必须根据类模板定义产生该类型。\n    return 0;\n}\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n类模板的成员函数\n类模板的成员函数可以在类模板的定义中定义(inline函数),也可以在类模板定义之外定义(此时成员函数定义前面必须加上template及模板参数)\n类模板成员函数本身也是一个模板,类模板被实例化时它并不自动被实例化,只有当它被调用或取地址,才被实例化\n类中的虚函数不能用类型参数模板\ntemplate \u003Ctypename T>\nclass Graphics {\npublic:\n    Graphics() {}\n    // 成员函数定义在类模板的定义中\n    void print() {}\n\n    // 类中的虚函数不能用类型参数模板\n    // template \u003Ctypename U>\n    // virtual void func(U value) {\n    // \n    // }\nprivate:\n    T m_value;\n};\n\n// 成员函数定义在类模板定义之外\ntemplate \u003Ctypename T>\nvoid Graphics\u003CT>::print()\n{\n}\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n普通类的成员函数模板\n#include \u003Ciostream>\n// 普通类\nclass MyTest {\npublic:\n    // 成员函数模板\n    template \u003Ctypename U>\n    void func(U val)\n    {\n        std::cout \u003C\u003C \"type=\" \u003C\u003C typeid(val).name() \u003C\u003C \" value:\" \u003C\u003C val \u003C\u003C std::endl;\n    }\n};\n\nint main()\n{\n    MyTest test;\n    test.func(100); // 普通类的成员函数模板:自动类型推导为int\n    test.func(10.0);// 普通类的成员函数模板:自动类型推导为double\n    return 0;\n}\n// 输出\n// type=i value:100\n// type=d value:10\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n类模板的成员函数模板\n#include \u003Ciostream>\n\n// 类模板\ntemplate \u003Ctypename T>\nclass MyTest {\npublic:\n    MyTest(T val) : m_val(val) {}\n    // 普通成员函数\n    void print()\n    {\n        std::cout \u003C\u003C \"print() type=\" \u003C\u003C typeid(m_val).name() \u003C\u003C \" m_val:\" \u003C\u003C m_val \u003C\u003C std::endl;\n    }\n    // 成员函数模板\n    template \u003Ctypename U>\n    void func(U val)\n    {\n        std::cout \u003C\u003C \"template type=\" \u003C\u003C typeid(val).name() \u003C\u003C \" value:\" \u003C\u003C val \u003C\u003C std::endl;\n    }\n\nprivate:\n    T m_val;\n};\n\nint main()\n{\n    MyTest\u003Cint> test(100);  // 类模板实例化,显示指定类型T-> int\n    test.print();\n    test.func(10.0);  // 类模板的成员函数模板,自动推导出U-> double\n\n    MyTest\u003Cdouble> test1(100.0);  // 类模板实例化,显示指定类型T-> double\n    test1.print();\n    test1.func(10);  // 类模板的成员函数模板,自动推导出U-> int\n\n     静态成员变量\n};\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n类模板特例化\n类模板的特化分为全特化与偏特化两种方式\n全特化:对于全特化,类的所有参数都与模板类的所有参数一一对应\n\n普通成员函数全特化\n静态成员变量全特化\ntemplate \u003Ctypename T, typename U>\nstruct MyTest\n{\n    MyTest()\n    {\n        std::cout \u003C\u003C \"类模板泛化\" \u003C\u003C std::endl;\n    }\n\n    void func()\n    {\n        std::cout \u003C\u003C \"func函数泛化\" \u003C\u003C std::endl;\n    }\n    static  int  m_value;// 静态成员变量\n};\n\n// 普通成员函数全特化\ntemplate \u003C>\nvoid MyTest\u003Cint, double>::func()\n{\n    std::cout \u003C\u003C \"func全特化\" \u003C\u003C std::endl;\n}\n\ntemplate\u003Ctypename T, typename U>\nint MyTest\u003CT, U>::m_value = 10;\n\n// 静态成员函数全特化\ntemplate\u003Ctypename T, typena

类模板定义中智能引用相关推荐

  1. 函数模板与类模板定义和使用

    模板是将具有相似性的类和函数归纳起来构成一个类族或函数族,它可是程序具有通用性.模板分为类模板和函数模板. 目录 (一)函数模板 一般定义形式 模板函数重载 函数模板参数 带有多类型参数的函数模板 ( ...

  2. 【无标题】类模板定义实例化

    类模板详解\n类模板的定义及实例化\ntemplate\u003Cclass 模板参数>\nclass 类名 {\n    // 类定义\n};\n\ntemplate\u003Ctypenam ...

  3. 「命名空间内部使用的名字的查找」与「类成员定义中使用的名字的查找」的区别

    二者都是向外查找,即本级作用域里没有找到,就向上一级的作用域去找这个名字出现的地方.区别就在于: 「命名空间内部使用的名字的查找」最终以全包围的全局命名空间结束: 「类成员定义中使用的名字的查找」如果 ...

  4. C++ Primer 5th笔记(chap 16 模板和泛型编程)类模板定义

    1. 定义 类似函数模板,类模板以关键字template开始,后跟模板参数列表.在类模板(及其成员)的定义中,我们将模板参数当作替身,代替使用模板时用户需要提供的类型或值: template < ...

  5. VS 2013 C++ 类模板定义与实现 进行分离

    最近在看C++类模板的定义与实现,在按照正常的类的流程进行分离时发现"LNK2019: 无法解析的外部符号"这个错误. 解决方案: 1. 如果坚持使用分离的方法解决,可以在main ...

  6. 初入c++(四)string类和c++中的引用

    1.string类 a.包含头文件 <string>      string s1;  定义的时候没有初始化,默认是空:   string s2 = "c  plus" ...

  7. 某函数定义中,引用同一个类讨论

    自己写了几行代码,为什么会有这样的结果嘞(为什么加了&Base::之后,都会输出为1?) Base函数的声明如下: #pragma once #include <iostream> ...

  8. 【无标题】类模板详解\n类模板的定义及实例化\ntemplate\u003Cclass 模板参数>\nclass 类名 {\n // 类定义\n};\n\ntemplate\u003Ctypen

    类模板详解\n类模板的定义及实例化\ntemplate\u003Cclass 模板参数>\nclass 类名 {\n    // 类定义\n};\n\ntemplate\u003Ctypenam ...

  9. 类模板详解\n类模板的定义及实例化 模板参数

    类模板详解\n类模板的定义及实例化\ntemplate\u003Cclass 模板参数>\nclass 类名 {\n    // 类定义\n};\n\ntemplate\u003Ctypenam ...

最新文章

  1. 用C#创建Windows服务(Windows Services)
  2. AI Drive 直播 | Objects365物体检测及CrowdHuman人体检测挑战赛线上颁奖
  3. ORA-04031: Unable To Allocate 32 Bytes Of Shared Memory
  4. 强网杯2020-dice2crybaby_crtbank
  5. TCP传输-出现差错的解决办法
  6. 中航工业集团金网络(北京)电子商务有限公司副总经理刘正珩:航空“智”造的供应链支撑平台...
  7. NET Core 指令启动
  8. 金币问题c语言程序,【求助】急请c语言高手帮忙解决程序问题(问题已经被我自己解决,金币送给自己啦)...
  9. 可调整大小的div_气液增压缸运行速度的调整以及压力的调节方式
  10. 三菱a系列motion软体_工控电缆如何制作?(以三菱PLC、触摸屏为例)
  11. 用JSLint+Ant检验HTML代码
  12. Educoder Basemap和Seaborn 第一关:Seaborn
  13. Python利用google翻译,翻译字幕文件!我想翻译日语!
  14. java读取rar_java怎么读取Zip和RAR里面的文件啊?
  15. 【双十一精选】史上最强的宝贝详情页设计思路以及操作流程
  16. 【随笔篇】2019全国大学生电子设计竞赛回望与总结
  17. 才意识到自己“奇葩”的360,会不会有些晚?
  18. php对接WPS开放平台word编辑demo
  19. 赚钱方式决定你的财富自由之路
  20. mc服务器物品展示,我的世界物品展示框怎么做

热门文章

  1. 淘宝开源平台“ 淘蝌蚪”正式上线
  2. Multisim 14.3 安装教程
  3. c语言那些编译器支持c11,有什么完美支持C11标准的IDE吗?
  4. linux apache php loadmodule,解决windows下安装Apache+PHP出现LoadModule takes two
  5. 解决ie9字体不垂直居中方法
  6. BMI指数(Body Mass Index)
  7. 浅谈java单元测试框架junit4/5
  8. 文件发放管理-给PDF文件添加电子受控章
  9. 元胞自动机交通模型案例2
  10. Visio画图-批量处理图片同等大小、等行距、等列距