C++ 双重模板类型?

C++ 双重模板类型?,c++,templates,double,C++,Templates,Double,我试图创建一个处理整数、双精度和字符串的泛型类。但是,当尝试使用实例化模板类时,我收到以下错误消息: error: 'double' is not a valid type for a template constant parameter 与内部代码一样,该实例化在int类型中也能很好地工作,尽管我还没有对字符串类型进行实例化。似乎这应该是好的,因为你们可以实例化向量,等等。这里有我遗漏的东西吗 // file forest.h template<typename NODETYPE&

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

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);
    /* ... */
};

您可以使用
double
(或
float
long double
)作为任何编译器的模板参数,甚至有点接近一致性。不能使用浮点值作为非类型的模板参数


通常,最接近这一点的方法是将浮点值传递给ctor,并将其存储在对象中。

禁止使用浮点值的模板常量参数(如double)

template <double x> struct A {};
如果您想为特定类型的double专门化模板,那么

template <typename T> struct A {};
template <> struct A<double> {...};
模板结构A{};
模板结构A{…};

您最有可能尝试这样做:

template_type<3.1415926d> blarg;  
template_-type blarg;
不知何故,某处。
这是不允许的。不允许双精度(浮动、长双精度)作为模板常量参数。 现在你可能也会遇到这样的情况:

template_type<"life, the universe and everything"> blarg;  
template_-type blarg;
由于某种原因,这也是不允许的,因为指针类型应该具有外部链接,因此:

char* my_str="life, the universe and everything";
template_type<my_str> blarg;
char*my_str=“生命、宇宙和一切”;
模板_型blarg;
应该没事吧

现在作为旁注:一些编译器确实允许使用浮点常量(iirc gcc 3,可能还有其他的)

模板friend Forest&operator+(Forest&f1,Forest&f2);

模板朋友ostream&operator@joedillian:“这里有我遗漏的东西吗?”-是的。您的问题中缺少一些代码。如果您能向我们展示一个再现问题的最小代码段,这将非常有帮助。您正在尝试使用模板类型参数、模板常量参数还是模板专门化?它们是不同的东西。也许你本想做其中一个,但在事故中又做了另一个?请展示一些代码,我们会帮你找出你在做什么,你应该做什么。老实说,我真的不知道如何对所说的错误做出一个缩影。上次我发帖时,有人告诉我不会得到任何帮助,因为我的代码样本太大了。现在我被告知我将被忽略,因为我无法提供代码。:/我将立即发布我的全部代码。@joedillian:我们之所以要求提供最小的代码片段,是因为它迫使您实际查看问题。我并不是说你没有对你的问题付出任何努力,但实际上,尝试用一个最小的代码片段重现这个问题将帮助你理解它的根本原因。此外,它还使我们能够更好、更快地查明根本原因,并提供更相关的答案。@joe:如果你理解了你的代码,你应该能够去掉不相关的部分,并发布剩下的内容。在没有代码的情况下询问代码中的错误,就像在没有汽车的情况下步行到汽车修理厂并询问“我的汽车出了什么问题?”。我的类是用模板声明的,朋友函数是用模板声明的。然而,当我试图实例化class*foo=new class()时,它说double不是一个可接受的参数。错误消息可能有误导性,但您不能执行
模板朋友林和运算符+(林和f1,林和f2)类似于
模板乐趣(T)一个正确的原型看起来像
模板乐趣(T)谢谢你的帮助。我有点明白我的错误是什么。基本上,我使用NODETYPE来引用林的类型和friend函数中输入的类型,对吗?
template_type<"life, the universe and everything"> blarg;  
char* my_str="life, the universe and everything";
template_type<my_str> blarg;
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);