我已经看到模板不能用double定义,因为它不是整数值。例如,以下代码将无法编译:
template <double x> double func()
{
return x;
}
但是,我想知道为什么在STL中允许定义double容器吗?谢谢!
答案 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>
,因为1
或2
不是类型而是值。
您将编写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
的哪种专业将适用。