реклама на сайте
подробности

 
 
> Частичная специализация методов в шаблоне класса, С++
jorikdima
сообщение Jun 22 2010, 19:15
Сообщение #1


тут может быть ваша реклама
*****

Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280



Здравствуйте.
Никогда не любил шаблоны, видимо потому что спал, когда на лекциях про них рассказывали, либо синтаксис просто жутко сложен. В общем сейчас нужна подсказка по ним. Использую scmRTOS, там шаблоы используются часто, в том чиле и для реализации кольцевого буфера.
Код
template<typename T, word Size, typename S = byte>
    class ring_buffer
    {
    public:
        ring_buffer() : Count(0), First(0), Last(0) { }

        //----------------------------------------------------------------
        //
        //    Data transfer functions
        //
        bool write(const T* data, const S cnt);
        void read(T* const data, const S cnt);
............................................................

У шаблона 3 параметра: тип хранимых данных, размер буфера и тип индексов. Есть функции записи и чтения, которые тоже реализованы шаблоном:
Код
template<typename T, word Size, typename S>
void usr::ring_buffer<T, Size, S>::read(T* data, const S cnt)
{
}

Так вот, я могу специализировать этот метод для конкретных параметров шаблона, например:
Код
template<>
void usr::ring_buffer<int, 100, int>::read(int* data, const int cnt)
{
}

И так оно работает (по крайней мере компилируется). Но! В данном случае, такой параметр шаблона как размер буфера, я бы хотел так и оставить параметом, специализировать я хочу только тип данных и тип индексов.
Хотел бы написать что-то вроде:
Код
template<>
void usr::ring_buffer<int, Size, int>::read(int* data, const int cnt)
{
}

Но говорит, что не знает что такое Size.
Я видел про специализацию шаблонов классов, но на сколько я понял, это более глобально, чем нужно мне. Не придется ли мне там переопределять все методы и поля класса? Мне-то нужно только read и write определить для частного случая хранения int. Как это описать?
Спасибо.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
jorikdima
сообщение Jun 23 2010, 07:06
Сообщение #2


тут может быть ваша реклама
*****

Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280



Спасибо за ответы.
DXP,
я пробовал тот синтаксис, что Вы привели, но к сожалению либо что-то недопонимаю, либо просто ошибка. Для примера я создал в VisualStudio проект, чтоб абстрагироваться от остального кода. Собственно там всего два файла:
.h
Код
template<typename T, int Size, typename S = char>
class ring_buffer
    {
    public:
        ring_buffer(): Count(0), First(0), Last(0) { }

        bool write(const T* data, const S cnt);
        void read(T* const data, const S cnt);
    private:
        S  Count;
        S  First;
        S  Last;
        T  Buf[Size];
    };

.c
Код
#include "t1.h"

template<typename T, int Size, typename S>
bool ring_buffer<T, Size, S>::write(const T* data, const S cnt)
    {
    return true;
    }

template<typename T, int Size, typename S>
void ring_buffer<T, Size, S>::read(T* data, const S cnt)
    {
    }

template<typename T, int Size, typename S>
void ring_buffer<char, Size, char>::read(T* data, const S cnt)
    {
    }

ring_buffer<char, 10> tmp;
void main()
    {

    tmp.write("ddsdsd", 7);

    }

Студия говорит:
Цитата
d:\mydocs\visual studio 2008\projects\templ\t1.cpp(17) : error C3860: template argument list following class template name must list parameters in the order used in template parameter list
1>d:\mydocs\visual studio 2008\projects\templ\t1.cpp(17) : error C2995: 'void ring_buffer<T,Size,S>::read(T *const ,const S)' : function template has already been defined
1> d:\mydocs\visual studio 2008\projects\templ\t1.h(10) : see declaration of 'ring_buffer<T,Size,S>::read'


Судя по всему, нельзя сделать так как я хочу. А именно, для конкретного набора параметров переопределить только два метода write и read , а реализацию остальных методов возложить на компилятор на общих основаниях. Тут либо не рыпаться, либо переписывать ВСЕ методы класса (вплоть до копипаста) для конкретного набора параметров. Странно, почему так...
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th July 2025 - 02:13
Рейтинг@Mail.ru


Страница сгенерированна за 0.0136 секунд с 7
ELECTRONIX ©2004-2016