C++模板

来源:互联网 发布:ubuntu snmp v3配置 编辑:程序博客网 时间:2024/05/20 21:22
 在类外定义类模板成员时,必须显示的将他们定义为模板。

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,如果没有这样做,在任何地方要使用模板,都将要求它的定义必须位于作用域中