C++ 模板未能编译:';双倍';不是模板常量参数的有效类型

C++ 模板未能编译:';双倍';不是模板常量参数的有效类型,c++,templates,C++,Templates,对于非类型模板参数,唯一有效的数值类型是整数和枚举。因此,您不能将非类型模板参数设置为double类型。非类型模板参数只能包含以下一项: 整型(例如int或long;) 枚举类型 指向对象的指针或引用 指向函数的指针或引用 指向类成员的指针 因此,它不能是双精度类型或类类型。 一般来说,非类型参数的基本原理是允许容器的大小和范围限制。我没有草稿,C++0x允许任何数字类型吗?@GMan:我记得有人建议允许任何数字类型,但N3092§14.3.2/1仍然说“一个整型常量表达式”,所以看起来不是

对于非类型模板参数,唯一有效的数值类型是整数和枚举。因此,您不能将非类型模板参数设置为
double

类型。非类型模板参数只能包含以下一项:

  • 整型(例如int或long;)
  • 枚举类型
  • 指向对象的指针或引用
  • 指向函数的指针或引用
  • 指向类成员的指针
因此,它不能是双精度类型或类类型。
一般来说,非类型参数的基本原理是允许容器的大小和范围限制。

我没有草稿,C++0x允许任何数字类型吗?@GMan:我记得有人建议允许任何数字类型,但N3092§14.3.2/1仍然说“一个整型常量表达式”,所以看起来不是。嗯,它需要标准化精度和舍入w.r.t.浮点运算,不是吗?嗯,这是不可能的。你可以让它取一个
int
,但是使用用户定义的文本指定值,比如
0.0\u myfloat
。这个文本可以调用一个文本运算符模板,该模板返回一个文本类类型,带有一个constexpr转换函数,返回到
int
,返回一个定点小数。@sellibitze:嗯,这些细节依赖于实现,是的,但这些细节(至少通常)在一个实现中是一致的,所以
T
总是会产生相同的实例化。至少有一个建议允许将任何文本用作非类型参数,但被拒绝(似乎没有评论;要么如此,要么我就是找不到与之相关的评论)。
template<typename T, T Min>
class LowerBoundedType {};
template<typename T> class vectorelement {};
template<> class vectorelement<Categorical> { typedef LowerBoundedType<double, 0.0> type; };
 error: 'double' is not a valid type for a template constant parameter