C++模板进阶

Posted by 川川的博客 on May 6, 2025

模板进阶

类型模板参数

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)
{
}