当前位置 博文首页 > Allen Roson:模板类与模版函数
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()
{
?
}
?
template <class T>
class base
{
};
template <class T,class F>
class derive :public base<T>
{
??? F f;
??? T t;
};
?
template <class T>
class base
{
};
?
class derive :public base<int>
{
};
?
?
template<类型形式参数表>
返回类型 函数名(形式参数表)
{
... //函数体
}
?
示例
template <class M, class E>
bool Compare(M a, E b)
{
??? return true;
}
?
函数模板不会被编译,而是在调用点实例化一个所指定类型参数的模板函数去调用。(函数模板—>实例化—>模板函数)也就是说,使用模板时并没有省略系统要编译的代码,只是把这些代码让系统通过我们定义的模板自己完成编写。
一般情况下,模板的定义都会写在头文件中,应用时直接包含头文件即可。如果采用头文件声明,cpp定义的话,会发现在编译链接时出现了链接错误(无法解析的外部符号)这是因为模板本身是不参加编译链接过程的,只有它实例化的模板函数才会进行编译和连接,不进行编译链接就没有任何的实例化,而实例化是在编译过程进行的,编译时各个cpp文件都是单独编译,因此单独在一个cpp文件中的模板定义也就不会产生符号,相当于这个函数只有声明没有函数体,那么另外一个文件中使用他时不知道如何实例化函数体,会出现找不到它的定义,因此就会出现链接错误.
cs