填坑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++模板类

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