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


Автор: Ivan. 23.5.2012, 10:37
Уважаемые программисты, помогите с шаблоном, совсем запутался. вроде бы все правильно делаю, но не получается.
Код
//Есть шаблонный класс:
template<class TArg, class TVal, u16 Count>
class TConv {
    ...
    //В нем есть шаблонный метод:
    template<class TFrom, class TTo>
    noinline static TTo Conv(TFrom From, TTo To, TFrom Arg);
}
//Тело шаблонного метода шаблонного класса:
template<class TArg, class TVal, u16 Count>
template<class TFrom, class TTo>
TTo TConv<TArg, TVal, Count>::Conv(TFrom From, TTo To, TFrom Arg)
{
    ...
}

Необходимо создать специализированный вариант метода для u32
Код
template<class TArg, class TVal, u16 Count>
template<> //Ругается на эту строку "Error    1 invalid explicit specialization before '>' token"
u32 TConv<TArg, TVal, Count>::Conv<u32, u32>(u32 From, u32 To, u32 Arg)

Что я не так делаю?
если вообще убрать эту строку, то выдает ошибку:
Error    1    template-id 'Conv<long unsigned int, long unsigned int>' in declaration of primary template

Автор: baldina 23.5.2012, 10:56
Ivan., у Вас получается частично специализированная функция. в С++ частично специализировать можно только классы
http://codepad.org/RO5oLdty

Добавлено @ 11:02
Цитата(Ivan. @  23.5.2012,  10:37 Найти цитируемый пост)
u32 TConv<TArg, TVal, Count>::Conv<u32, u32>(u32 From, u32 To, u32 Arg)

тип Arg не соответствует типу прототипа (TArg)
можно решить через перегрузку (добавить еще один прототип в класс)

невнимательно читал)

Автор: Ivan. 23.5.2012, 11:10
Спасибо огромное. Задача решилась. Слава богу, что при вызове метода шаблонный класс сводился к единому, чтобы не плодить код. Правда реализация метода вылезает из хедера в сишный файл, но это мелочь.

Добавлено через 5 минут и 49 секунд
Цитата(baldina @  23.5.2012,  10:56 Найти цитируемый пост)
тип Arg не соответствует типу прототипа (TArg)можно решить через перегрузку (добавить еще один прототип в класс)

Здесь все в порядке, он и не должен соответствовать. шаблонный класс нужен только для создания структуры. потом все методы вызываются с единым шаблоном:
Код

class TConv {
    struct TData {
        TArg Arg;
        TVal Val;
    }; //Точка отношения
    u8 Size; //Размерность
    TData Data[Count]; //массив отрезков
    typedef TConv<u8, u8, 1> TConvNull; //Унификация шаблона
};
...
TVal Val = TConvNull::Conv(ArgMax, ValMax, Arg);
...

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