为什么在STL中允许<double>

时间:2019-09-11 11:56:32

标签: c++

我已经看到模板不能用double定义,因为它不是整数值。例如,以下代码将无法编译:

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

但是,我想知道为什么在STL中允许定义double容器吗?谢谢!

4 个答案:

答案 0 :(得分:9)

您正在混合类型名和类型实例。 当您这样做时:

template <int a> struct A {};

您正在声明一个模板结构,该模板结构的标签会有所不同,并且此标签是整数。 因此,A<1>A<2>将是完全不同的类型。

当您这样做:

template <typename T> struct A { T a; A(T a) : a(a) {} };

您要声明的模板结构将因给定的类型而有所不同。因此,您不能这样写:A<1>A<2>,因为12不是类型而是值。

您将编写A<int>,任何int都将使用该相同类型,因此A<int> a(1)A<int> b(2)

的类型完全相同

答案 1 :(得分:5)

您正在将模板类型参数与模板非类型参数混淆。在您的示例中,参数是类型double的值。在std::vector<double>中,参数为类型double

double确实将值进行了比较以比较是否相等,而类型double则没有这样的问题。

答案 2 :(得分:3)

  

我想知道为什么在STL中允许定义double容器吗?

因为double容器不需要具有double类型的模板 non-type 参数。该语言允许将任何类型(包括双精度)传递给模板 type 参数,这是通用容器用来指定值类型的内容。

答案 3 :(得分:2)

C ++不允许将浮点文字用作模板非类型参数。 Cf,整数类型:

template <int N> class foo{};

是允许的,但

template <double N> class bar{};

不是。其基本原理是该标准未指定大多数浮点类型的实现。因此很难定义bar的哪种专业将适用。