template<class C>
String<C>::String()
{
}
template<class C>
String<C>::String<C>()
{
}
以上两种定义都可以
类模板的名字不能重载,例如
template<class T>
class String
{
};
class String //错误,重复定义
{
};
模板可以有类型参数,可以有常规类型的参数如int,还可以有模板参数。自然,一个模板可以有多个参数。例如
template<class T, T def_val>
class Cont
{
};
整数参数常常被用于提供大小或者界限,例如
template<class T, int i>
class Buffer
{
T v[i];
int sz;
public:
Buffer() : sz(i) {}
};
整数模板参数必须是常量。
void f(int i)
{
buffer<int, i> bx; //错误,需要常量表达式
}
模板支持默认参数,例如
template<class T, class C = int>
void fun(T a, C b)
{
}
template<class T> class Vector; //一般情况
template<class T> class Vector<T*>; //对任何指针的特化
template<> class Vector<void*>; //对void*的特化
虚函数提供的东西称为运行时多态;模板提供的东西称为编译时多态
//out.h
template<class T> void out(const T& t);
//out.c
#include <iostream>
#include "out.h"
export template<class T> void out(const T& t){std::cout << t;}
一定要加关键字export,如果没有这样做,在任何地方要使用模板,都将要求它的定义必须位于作用域中