2011-01-21 3 views
1

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

Car<T> 

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

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

}; 


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

класс автомобиля:

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

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

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

Но эта конструкция ОК

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

Работает ли она без строки 'template <>'? – fredoverflow

+0

Мне кажется, вам действительно нужно определить явную спецификацию List >, потому что это то, о чем жалуется мой компилятор: «Недопустимое использование неполного типа» struct List > « – BatchyX

+0

btw Как выглядит автомобиль? –

ответ

0

This faq item должны получить ты.

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

struct Car 
{ 
}; 

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

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

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>, но вместо этого вы частично специализируетесь на этом, учитывая, что templat типа. Во всяком случае, мой вывод может быть неправильным.

Смежные вопросы