Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Частичная специализация шаблона


Автор: azesmcar 26.1.2006, 19:27
Код

class CNullType{};

template <class H, class T>
struct CTypeList
{
   typedef H Head;
   typedef T Tail;
};

template<class TL> struct CTypeListLength;

template<class H, class T>
struct CTypeListLength< CTypeList<H, T> >
{
   enum { value = 1 + CTypeListLength<T>::value };
};

template<>
struct CTypeListLength<CNullType>
{
   enum { value = 0 };
};


Этот код выдает ошибку
Цитата

template class has already been defined as a non-template class

хотя по идее не должен..что не так?

Заранее спасибо..

Автор: chipset 26.1.2006, 19:35
Какой компилятор? Где точно ошибка? Комяу скомпилировал только так.

Автор: MAKCim 26.1.2006, 22:05
здесь явно нет ошибок, хотя, может быть, она где-то в другом месте...

Автор: np9mi7 26.1.2006, 23:42
Код

template<class TL> struct CTypeListLength;

template<class H, class T> struct CTypeListLength;            /// вот она и ошибка

Автор: azesmcar 27.1.2006, 09:14
Видимо мало данных предоставил smile думал у всех она выдается...

Компилятор Visual Studio 6.0, G++ пробовал оба...

ошибка
Цитата

template class has already been defined as a non-template class

на строке
Код

struct CTypeListLength< CTypeList<H, T> >


Цитата

template<class H, class T> struct CTypeListLength;            /// вот она и ошибка


да нет как раз, мне нужна спецификация для типа TL, TL должен быть типа CTypeList<H, T>
Все вроде бы должно работать, фигня какая то smile
Добавлено @ 09:15
Цитата

здесь явно нет ошибок, хотя, может быть, она где-то в другом месте...


другого места нет, это весь код...

Автор: np9mi7 27.1.2006, 10:27
Цитата
да нет как раз, мне нужна спецификация для типа TL, TL должен быть типа CTypeList<H, T>
Все вроде бы должно работать, фигня какая то smile
, ты объявляешь класс с одним набором параметров, а потом определяешь его с другим набором параметров;

Автор: azesmcar 27.1.2006, 10:55
Цитата

, ты объявляешь класс с одним набором параметров, а потом определяешь его с другим набором параметров;


Я объявляю его с тем же набором параметров...
Цитата

struct CTypeListLength< CTypeList<H, T> >


Это и есть частичная спецификация шаблона..которую как оказалось Visual C++ 6.0 не поддерживает...а в G++ выдавалась другая, похожая ошибка но по другой причине...

исправил уже smile

Код

#ifndef __CTYPELIST_H__
#define __CTYPELIST_H__

class CNullType{};

template <class H, class T>
struct CTypeList
{
        typedef H Head;
        typedef T Tail;
};

template<class TL> struct CTypeListLength;

template<class H, class T>
struct CTypeListLength< CTypeList<H, T> >
{
        enum { value = 1 + CTypeListLength<T>::value };
};

template<>
struct CTypeListLength<CNullType>
{
        enum { value = 0 };
};

#endif


код работает...всем спасибо..

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)