Шаблоны. Почему тут ошибка?
От: Аноним  
Дата: 10.05.06 07:25
Оценка:
class Unsafe{
private:
Unsafe* m_pNextUnsafe;
public:
Unsafe(){}
virtual ~Unsafe(){}

Unsafe* GetNext() { return m_pNextUnsafe; }
};

template<class T>
class LClass : public Unsafe{
public:
LClass();
virtual ~LClass();

LClass* GetNext(){ return (LClass*) Unsafe::GetNext(); }
};

LClass<class T>::LClass(){}
LClass<class T>::~LClass(){} <---- тут ошибка

error C2906: 'LClass<T>::~LClass(void)' : explicit specialization requires 'template <>'
with
[
T=T
]

Но ! Если деструктор описать так
template<>
LClass<class T>::~LClass(){}

то всё отлично.
Причём ! Если убрать наследование у LClass
то при описаном вот так деструктором
LClass<class T>::~LClass(){}
возникавшая ранее ошибка C2906
не возникает!

Очень хочется понят:
Почему при разных условиях нследуем/не наследуем возникает / не возникает ошибка C2906
Почему когда наследуем ошибка C2906 возникает толькт у деструктора.

Спасибо.
Re: Шаблоны. Почему тут ошибка?
От: Bell Россия  
Дата: 10.05.06 07:49
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Очень хочется понят:

А>Почему при разных условиях нследуем/не наследуем возникает / не возникает ошибка C2906
А>Почему когда наследуем ошибка C2906 возникает толькт у деструктора.

А>Спасибо.


Если использовать правильный синтаксис, то можно очень здорово облегчить себе жизнь:

template <class T>
LClass<T>::LClass(){}

template <class T>
LClass<T>::~LClass(){}

Любите книгу — источник знаний (с) М.Горький
Re: Шаблоны. Почему тут ошибка?
От: night beast СССР  
Дата: 10.05.06 08:02
Оценка:
Здравствуйте, Аноним, Вы писали:

А>class Unsafe{
А>private:
А>    Unsafe*    m_pNextUnsafe;
А>public:
А>    Unsafe(){}
А>    virtual ~Unsafe(){}

А>    Unsafe*    GetNext() { return m_pNextUnsafe; }
А>};

А>template<class T>
А>class LClass : public Unsafe{
А>public:
А>    LClass();
А>    virtual ~LClass();

А>    LClass* GetNext(){ return  (LClass*) Unsafe::GetNext(); }
А>};

А>LClass<class T>::LClass(){}
А>LClass<class T>::~LClass(){} <---- тут ошибка


здесь class T означает не параметр шаблона, а некоторый тип под названием T,
который будет определен далее. а поскольку это конкретный тип, то оба объявление -- специализации и они должы быть описаны
A>template<>
А>LClass<class T>::LClass(){}

если хочешь для всех типов, то
template<typename T>
LClass<T>::LClass(){}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.