模板进阶
类型模板参数
template<class T>
//template<typename T>
class A
{};
非类型参数
//#define N 100
template<class T,int N>
classs Array
{
public:
private:
T _a[N];
};
int main()
{
Array<int,100> a1;
Array<int,1000> a2;
}
注意:浮点类型,字符串,自定义类型不能做为非类型模板参数
模板的特化
template<class T>
bool IsEqual(T& left,T& right)
{
return left==right;
}
//特化啊(针对某些类型的特殊化处理)
template<>
bool IsEqual<char*>(char*& left,char*& right)
{
return strcmp(left,right) == 0;
}
//类的特化
template<>
class Date<T1,T2>
{
};
//全特化
template<>
class Date<int,char>
{
};
//偏特化
template<class T2>
class Date<int,T2>
{
};
template<class T1,class T2>
class Date<T1*,T2*>
{
};
template<class T1,class T2>
class Date<T1&,T2&>
{
};
模板不能分离编译
工程中一般将函数或者类的声明放到.h,将函数或者类的定义放到.cpp
同样是分离编译,普通函数/类可以,函数模板/类模板为什么不行?
Func.h Func.cpp Test.cpp
1.预处理 展开头文件/宏替换/条件编译/去掉注释
Func.i Test.i
2.编译 检查语法,生成汇编代码
Func.s Test.s
3.汇编 将汇编代码转换成二进制机器码
Func.o Test.o
4.链接
a.out
原因:链接时 普通函数在Func.o符号表中有地址,函数模板没有实例化,在符号表中找不到地址
解决方法:1.模板显示实例化
2.模板写到Func.h中,不要分离编译
template<class T>
void F2(const T& x)
{
}
//显示实例化
template
void F2<int>(const int& x)
{
}