填坑C++模板类

作者: smart_Alex | 来源:发表于2016-07-30 18:43 被阅读246次

大神们常说不要重复造轮子,
小编说不要重复踩坑,希望小编踩过得坑大家不要再踩。

模板类的编译和普通类是截然不同的,所以我们在写模板类的时候需要注意两个常见的语法问题。


  • 模板类的声明与定义要放在同一文件下。

简而言之,就是所有代码都要写在头文件.h中。
举个例子,我们写一般类的做法是

//demo_A.h
class demo_A{
    void function_A();
};
//demo_A.cpp
void demo_A::function_A(){/*...*/}

但是,我们在写模板类的时候不能这样做,应该都写在头文件里

//demo_A.h
template class<T>
class demo_A{
    void function_A();
};
template class<T>
void demo_A<T>::function_A(){/*...*/}

为什么会这样呢,我的理解是,不同的模板是不同的类型,会生成不同的代码,函数的入口地址也会不一样。而编译器在模板使用之前是不知要要套用哪个类型的。所以模板类的实现,脱离具体的使用,是无法单独的编译的;把声明和实现分开的做法也是不可取的,必须把实现全部写在头文件里面。


  • 模板类继承中,派生类访问基类保护对象要加范围解析操作符(::),或者加this->

举个例子,我们写一般类的做法是

class demo_Base{
protected:
      int _a;    
};

class demo_Derived: public demo_Base{
    void functionB(){
         _a = 1;     //直接访问基类保护对象
    }
};

但是在模板类中,这样做就会报错,无法识别变量_a。

方法一:我们要在_a前加范围解析操作符::
方法二:在_a前加this->
template class<T>
class demo_Base{
protected:
    T _a;
};

template class<T>
class demo_Derived: public demo_Base<T>{
      void functionB(){
            demo_Base<T>::_a = 1; //方法一
            this->_a = 1;         //方法二 
      }
};

我的理解是:因为派生类模板在具体套用类型之前,编译器实际上是不知道基类是谁的,找不到基类的定义与声明。因此,我们就用范围解析符或者this指针帮它找到基类中的对象。

相关文章

  • 填坑C++模板类

    大神们常说不要重复造轮子,小编说不要重复踩坑,希望小编踩过得坑大家不要再踩。 模板类的编译和普通类是截然不同的,所...

  • Geekband C++ 第五周

    概述 C++模板简介 函数模板 C++类模板 操作符重载 泛型编程 容器

  • C++类模板

    一、定义 C++ 类模板 定义一个 C++ 类模板和定义一个函数模板类似,可以指定一个或者多个模板参数标识符。在类...

  • 10-C++远征之模板篇-学习笔记

    C++远征之模板篇 将会学到的内容: 模板函数 & 模板类 -> 标准模板类 友元函数 & 友元类 静态数据成员 ...

  • 慕课网-C++远征之模板篇(上)-学习笔记

    C++远征之模板篇 将会学到的内容: 模板函数 & 模板类 -> 标准模板类 友元函数 & 友元类 静态数据成员 ...

  • C++ STL初识及整理

    概述 简介 简单介绍:C++ STL(标准模板库)是一套功能强大的 C++ 模板类,提供了通用的模板类和函数,这些...

  • C++ 模板开发

    C++模板开发分为两类: 模板函数开发 模板类开发 模板函数语法: template是关键字,

  • C++11泛型 - 类模板

    前面我们介绍了函数模板。今天我们来看看C++的另一种泛型:类模板。C++中类模板通常是容器(如std::vecto...

  • 【C++ Templates(11)】深入模板基础

    参数化声明 C++现在支持四种基本模板:类模板,函数模板,变量模板(variable template),别名模板...

  • 05-Django模板

    一、模板概述 模板组成HTML代码动态插入的代码(挖坑、填坑逻辑控制代码) 作用快速生成HTML页面 优点模板的设...

网友评论

    本文标题:填坑C++模板类

    本文链接:https://www.haomeiwen.com/subject/uydtsttx.html