双打为模板类型?

时间:2010-10-31 21:48:26

标签: c++ templates double

我正在尝试创建一个处理整数,双精度和字符串的泛型类。但是,当我尝试使用实例化模板类时,我收到以下错误消息:

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|

4 个答案:

答案 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(或floatlong 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> {...};