Явная специализация, C ++ - PullRequest
       9

Явная специализация, C ++

1 голос
/ 21 января 2011

Как написать явную специализацию для объекта

Car<T>

в виртуальном методе clear ()?

template <class U>
class List
{
   public:
        virtual void clear();

};


template <class T>
template <>
void List < Car <T> >::clear()   //Specialization U = Car <T>, compiler error
{
    ....
}

class car:

template <class T>
class Car
{
   T speed;
   ...
}

Ошибка компиляции:

Ошибка 16 Ошибка C3855: «Список»: параметр шаблона «Автомобиль» несовместим с объявлением h: ... \ List.hpp 75 Ошибка 20 Ошибка C2264: «Список :: очистить»: ошибка в функцииопределение или декларация;функция не называется h: ... \ List.hpp 75

Но эта конструкция в порядке

template <>
void List < Car <double> >::clear()   //Specialization U = Car <T>, compiler error
{
    ....
}

Ответы [ 2 ]

2 голосов
/ 21 января 2011

Я думаю, что единственный способ сделать это:

template<class T>
class Car
{
};

template <class U>
class List
{
   public:
        virtual void clear();

};

template <class T>
class List<Car<T> >
{
    public:
        virtual void clear() { /* specialization */ }
};

или не встроенная версия:

template <class T>
class List<Car<T> >
{
    public:
        virtual void clear();
};

template <class T>
void List<Car<T> >::clear() {
   /* specialization */ 
}

, поскольку вы на самом деле не специализируете List<T>, а вместо этого вычастично специализируются на нем, учитывая, что тип шаблона все еще появляется.Во всяком случае, мой вывод может быть неправильным.

0 голосов
/ 21 января 2011

Этот часто задаваемый вопрос должен помочь вам.

Поэтому это что-то вроде этого:

struct Car
{
};

template <>
void List < Car >::clear()   //Specialization U = Car <T>, compiler error
{
    ....
}
...