填坑C++模板类

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

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


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

简而言之,就是所有代码都要写在头文件.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指针帮它找到基类中的对象。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy阅读 13,161评论 1 51
  • 重新系统学习下C++;但是还是少了好多知识点;socket;unix;stl;boost等; C++ 教程 | 菜...
    kakukeme阅读 20,339评论 0 50
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 176,831评论 25 709
  • C++文件 例:从文件income. in中读入收入直到文件结束,并将收入和税金输出到文件tax. out。 检查...
    SeanC52111阅读 8,094评论 0 3
  • 谁是郝明义 郝明义,1956年生于韩国,一岁时得了小儿麻痹,从此双腿失去了站立能力。在父母细心呵护和朋友们的帮助下...
    LuckySilly阅读 2,629评论 0 0

友情链接更多精彩内容