文档库 最新最全的文档下载
当前位置:文档库 › 模板类声明和定义

模板类声明和定义

模板类声明和定义
模板类声明和定义

模板类声明和定义

如何组织编写模板程序

前言

常遇到询问使用模板到底是否容易的问题,我的回答是:“模板的使用是容易的,但组织编写却不容易”。看看我们几乎每天都能遇到的模板类吧,如STL, ATL, WTL, 以及Boost的模板类,都能体会到这样的滋味:接口简单,操作复杂。

我在5年前开始使用模板,那时我看到了MFC的容器类。直到去年我还没有必要自己编写模板类。可是在我需要自己编写模板类时,我首先遇到的事实却是“传统”编程方法(在*.h文件声明,在*.cpp文件中定义)不能用于模板。于是我花费一些时间来了解问题所在及其解决方法。

本文对象是那些熟悉模板但还没有很多编写模板经验的程序员。本文只涉及模板类,未涉及模板函数。但论述的原则对于二者是一样的。

问题的产生

通过下例来说明问题。例如在array.h文件中有模板类array:

// array.h

template

class array

{

T data_[SIZE];

array (const array& other);

const array& operator = (const array& other);

public:

array(){};

T& operator[](int i) {return

data_[i];}

const T& get_elem (int i) const {return data_[i];}

void set_elem(int i, const T& value) {data_[i] = value;}

operator T*() {return

data_;}

};

然后在main.cpp文件中的主函数中使用上述模板:

// main.cpp

#include "array.h"

return data_[i];

}

template void array::set_elem(int i, const T& value) {

data_[i] = value;

}

template array::operator T*()

{

return data_;

}

编译时会出现3个错误。问题出来了:

为什么错误都出现在第一个地方?

为什么只有3个链接出错?array.cpp中有4个成员函数。

要回答上面的问题,就要深入了解模板的实例化过程。

相关文档