我在一个网站上看到声明
template <int x>
int func() {
return x;
}
有效,而以下无效
template <double x>
double func() {
return x;
}
为什么第一个是模板函数的合法声明,而第二个不是?
我在一个网站上看到声明
template <int x>
int func() {
return x;
}
有效,而以下无效
template <double x>
double func() {
return x;
}
为什么第一个是模板函数的合法声明,而第二个不是?
它无效,因为它不是整数类型。非类型模板参数有一定的限制,这是其中之一,它说...
浮点数和类类型对象不允许作为非类型模板参数。
template <double VAT> // ERROR: floating-point values are not
double process(double v) { // allowed as template parameters
return v * VAT;
}
template <std::string name> // ERROR: class-type objects are not
class MyClass { // allowed as template parameters
/* ... */
};
以上引自C++ Templates。我没有学分。
根据我的理解,它们对模板初始化无效的原因是,像 float 和 double 这样的类型在 C++ 中没有定义的实现。所以当一个模板像
template <double VAT> double process(double v);
用两个不同的双精度值初始化为
template <(double) 2/3> double process(2.3)
template <(double) 1/3> double process(2.4);
由于双重非类型,它们可能没有相同的位表示,这会使编译器感到困惑。