为什么浮点类型模板函数的模板参数类型无效?

时间:2012-08-04 05:10:39

标签: c++ floating-point template-function

我在网站上看到了宣言

template <int x>
int func() {
  return x;
} 

有效,而以下不是

template <double x>
double func() {
  return x;
}

为什么第一个是模板函数的合法声明而第二个不是?

1 个答案:

答案 0 :(得分:3)

它无效,因为它不是整数类型。非类型模板参数有一些限制,这是其中之一,它说......

  

不允许使用浮点数和类类型对象作为非类型模板参数。

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);

用两个不同的double值初始化为

template <(double) 2/3> double process(2.3)

template <(double) 1/3> double process(2.4);

由于double nontype,它们可能没有相同的位表示,这会使编译器感到困惑。