4.3 非类型模板参数的限制
我们还应该知道:非类型模板参数是有限制的。通常而言,它们可以是常整数(包括枚举值)或者指向外部链接对象的指针。
浮点数和类对象(class-type) 是不允许作为非类型模板参数的:
template<double VAT> //ERROR:浮点数不能作为非类型模板参数
double process (double v)
{
return v * VAT;
}
template<std::string name> //ERROR:类对象不能作为非类型模板参数
class MyClass {
...
};
之所以不能使用浮点数(包括简单的常量浮点表达式)作为模板实参是有历史原因的。然而,该特性的实现并不存在很大的技术障碍;因此,将来的C++(www.cppentry.com)版本可能会支持这个特性。
由于字符串文字是内部链接对象(因为两个具有相同名称但处于不同模块的字符串,是两个完全不同的对象),所以你不能使用它们来作为模板实参:
template<char const* name>
class MyClass {
...
};
MyClass<”hello”> x; //ERROR:不允许使用字符串文字”hello”
另外,你也不能使用全局指针作为模板参数:
template <char const* name>
class MyClass {
...
};
char const* s = ”hello”;
MyClass<s> x; //s是一个指向内部链接对象的指针
然而,你可以这样使用:
template <char const* name>
class MyClass {
...
};
extern char const s[] = ”hello”;
MyClass<s> x; //OK
全局字符数组s由“hello”初始化,是一个外部链接对象。
详细的讨论,请见8.3.3小节;而13.4节给出了将来在这方面可能出现的改变。