Удваивается как тип шаблона? - PullRequest
3 голосов
/ 01 ноября 2010

Я пытаюсь создать универсальный класс, который обрабатывает целые, двойные и строковые значения.Однако при попытке создать экземпляр класса шаблона с помощью я получаю следующее сообщение об ошибке:

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 ]

4 голосов
/ 01 ноября 2010
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 что-то еще.

3 голосов
/ 01 ноября 2010

Вы можете использовать double (или float или long double) в качестве параметра шаблона для любого компилятора, даже близкого к соответствующему.То, что вы не можете сделать - это использовать значение с плавающей запятой в качестве нетипичного параметра шаблона.

Самое близкое к этому, как правило, передача плавающей запятойукажите значения в ктор и сохраните их в своем объекте.

2 голосов
/ 01 ноября 2010

вы, скорее всего, пытаетесь сделать что-то вроде этого:

template_type<3.1415926d> blarg;  

где-то, как-то.
это не разрешено double (с плавающей точкой, long double) не допускаются в качестве постоянных параметров шаблона. теперь вы, вероятно, тоже столкнетесь с этим:

template_type<"life, the universe and everything"> blarg;  

это тоже (по некоторым причинам) недопустимо, так как тип указателя должен иметь внешнюю связь так:

char* my_str="life, the universe and everything";
template_type<my_str> blarg;

будет просто отлично

Теперь в качестве примечания: некоторые компиляторы разрешают или разрешают использовать константы с плавающей точкой (iirc gcc 3, возможно, другие)

1 голос
/ 01 ноября 2010

Параметр константы шаблона значения с плавающей запятой (например, 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> {...};
...