模板实例化系统取决于类型名称,等效于决定哪些模板需要实例化或重新实例化。因此本地类型用作模板参数时,会导致严重的问题。小心在代码中也出现类似的问题。
示例 6-1 本地类型用作模板参数问题的示例array.h
template <class Type> class Array {
Type* data;
int size;
public:
Array(int sz);
int GetSize();
};
array.cc
template <class Type> Array<Type>::Array(int sz)
{size = sz; data = new Type[size];}
template <class Type> int Array<Type>::GetSize()
{return size;}
file1.cc
#include "array.h"
struct Foo {int data;};
Array<Foo> File1Data(10);
file2.cc
#include "array.h"
struct Foo {double data;};
Array<Foo> File2Data(20);
在 file1.cc 中注册的 Foo 类型与在 file2.cc 中注册的 Foo 类型不同。以这种方法使用本地类型会出现错误和意外的结果。