当前位置 博文首页 > Allen Roson:模板类与模版函数

    Allen Roson:模板类与模版函数

    作者:[db:作者] 时间:2021-07-09 09:42

    1.模板类与模版函数

    1.1 模版类

    template <类型参数表>

    class 类模板名{

    ??? 成员函数和成员变量

    };

    ?

    类型参数表的写法如下:

    class类塑参数1, class类型参数2, ...

    或者

    typename类塑参数1, typename类型参数2, ...

    ?

    示例:

    template <class T,class M>

    class Test {

    ??? T obj;

    };

    ?

    template <typename T, typename M>

    class MyClass {

    ??? T obj;

    };

    ?

    类模板中的成员函数放到类模板定义外面写时的语法如下:

    template <类型参数表>

    返回值类型? 类模板名<类型参数名列表>::成员函数名(参数表)

    {

    ??? ...

    }

    ?

    template <typename T, typename M>

    void MyClass<T, M>::Func1()

    {

    ?

    }

    ?

    1.2模版类的派生

    1.2.1从模板类派生模板类

    template <class T>

    class base

    {

    };

    template <class T,class F>

    class derive :public base<T>

    {

    ??? F f;

    ??? T t;

    };

    ?

    1.2.2从模板类派生非模板类,基类在被继承时必须实例化

    template <class T>

    class base

    {

    };

    ?

    class derive :public base<int>

    {

    };

    ?

    ?

    1.3模版函数

    template<类型形式参数表>

    返回类型 函数名(形式参数表)

    {

    ... //函数体

    }

    ?

    示例

    template <class M, class E>

    bool Compare(M a, E b)

    {

    ??? return true;

    }

    ?

    函数模板不会被编译,而是在调用点实例化一个所指定类型参数的模板函数去调用。(函数模板—>实例化—>模板函数)也就是说,使用模板时并没有省略系统要编译的代码,只是把这些代码让系统通过我们定义的模板自己完成编写。

    一般情况下,模板的定义都会写在头文件中,应用时直接包含头文件即可。如果采用头文件声明,cpp定义的话,会发现在编译链接时出现了链接错误(无法解析的外部符号)这是因为模板本身是不参加编译链接过程的,只有它实例化的模板函数才会进行编译和连接,不进行编译链接就没有任何的实例化,而实例化是在编译过程进行的,编译时各个cpp文件都是单独编译,因此单独在一个cpp文件中的模板定义也就不会产生符号,相当于这个函数只有声明没有函数体,那么另外一个文件中使用他时不知道如何实例化函数体,会出现找不到它的定义,因此就会出现链接错误.

    cs
    下一篇:没有了