我正在尝试创建一个处理整数,双精度和字符串的泛型类。但是,当我尝试使用实例化模板类时,我收到以下错误消息:
error: 'double' is not a valid type for a template constant parameter
实例化对于int类型完全正常,内部代码也是如此,尽管我还没有将其用于字符串类型。似乎这应该没问题,因为你可以实例化矢量等。这里有什么我想念的吗?
// file forest.h
template<typename NODETYPE> class Forest
{
template<NODETYPE> // Line 15
friend Forest<NODETYPE>& operator+(Forest<NODETYPE>& f1,
Forest<NODETYPE>& f2);
template<NODETYPE> // Line 17
friend ostream& operator<<(ostream& output,
const Forest<NODETYPE>& f1);
template<NODETYPE> // Line 19
friend void outputHelper(ostream& output,
const ForestNode<NODETYPE>& currentNode,
int depth);
/* ... */
};
错误发生如下:
\project 4\forest.h|341|instantiated from here|
\project 4\forest.h|15|error: 'double' is not a valid type for a template constant parameter|
\project 4\forest.h|17|error: 'double' is not a valid type for a template constant parameter|
\project 4\forest.h|19|error: 'double' is not a valid type for a template constant parameter|
答案 0 :(得分:4)
template<NODETYPE> friend Forest<NODETYPE>& operator+(Forest<NODETYPE>& f1, Forest<NODETYPE>& f2);
template<NODETYPE> friend ostream& operator<<(ostream& output, const Forest<NODETYPE>& f1);
template<NODETYPE> friend void outputHelper(ostream& output, const ForestNode<NODETYPE>& currentNode, int depth);
这些朋友声明无效。如果你有一个模板化的类,你在它自己的范围内引用它时不需要重复它的模板参数。即使你打算允许任何其他的Forest实例化,你也必须使用typename或class并调用NODETYPE。
答案 1 :(得分:3)
您可以使用double
(或float
或long double
)作为模板参数,使用任何符合要求的编译器。 无法做的是使用浮点值作为非类型模板参数。
你可以得到的最接近的通常是将浮点值传递给ctor,并将它/它们存储在你的对象中。
答案 2 :(得分:2)
你最有可能尝试这样做:
template_type<3.1415926d> blarg;
不知怎的,在某个地方
这是不允许的。双精度(浮点数,长双精度数)不允许作为模板常量参数。
现在你可能遇到的事情就是:
template_type<"life, the universe and everything"> blarg;
这也是(由于某种原因)不可接受的,因为指针类型应该具有外部链接,所以:
char* my_str="life, the universe and everything";
template_type<my_str> blarg;
shoule就好了
现在作为旁注:一些编译器确实或允许浮点常量(iirc gcc 3,可能是其他编译器)
答案 3 :(得分:1)
禁止浮点值的模板常量参数(如double)。
template <double x> struct A {};
但是,你可以实例化一个类型为double
的模板(如果我得到你的问题,你想做什么)。
template <typename T> struct A {};
...
A<double> a;
如果您想为特定类型double专门化模板,请执行
template <typename T> struct A {};
template <> struct A<double> {...};