【问题标题】:Why are floating point types invalid template parameter types for template functions?为什么浮点类型对于模板函数是无效的模板参数类型?
【发布时间】:2012-08-04 05:10:39
【问题描述】:

我在一个网站上看到声明

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

有效,以下无效

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

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

【问题讨论】:

  • 网站链接会有所帮助。
  • 它只是一个 mcq,其中有 3 个选项,其中前两个是前两个,第三个是涉及 typename 的模板声明,必须选择无效的一个,答案是一个带双的..
  • 我认为这基本上归结为很难以一种可以在不同的编译器和浮点表示中合理地工作的方式来指定浮点相等的含义。
  • 顺便说一句:如果您正在寻找解决此限制的方法。创建一个具有返回所需值的内联静态方法的类,并将该类作为模板参数传递。

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


【解决方案1】:

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

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

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

由于双重非类型,它们可能没有相同的位表示,这会使编译器感到困惑。

【讨论】:

  • 问题是为什么浮点类型不是有效的非类型模板参数。
  • @Prætorian- 根据我的理解添加了原因。如有错误请指正。
猜你喜欢
  • 2014-01-12
  • 1970-01-01
  • 1970-01-01
  • 2021-08-15
  • 2021-11-02
  • 2020-12-20
  • 1970-01-01
  • 2019-04-24
  • 2011-07-06
相关资源
最近更新 更多