Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос по работе с шаблонным классам 
V
    Опции темы
OlegSK
Дата 7.2.2011, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 17.7.2010

Репутация: нет
Всего: нет



Читаю книгу Шилдта, "Полный справочник по C++" (4-е издание) и сейчас закончил чтение главы посвященной шаблонам. К сожалению, Шилдт как-то скомкал описание явно заданных специализаций для шаблонных классов. В частности, он не показал как делать определение методов явно заданной специализации класса вне объявления класса-специализации. Помогите, плиз, разобраться с этим... Например, есть следующий шаблонный класс:

Код

const int SIZE = 10;

template<typename T>
class cStack
{
    T stack[SIZE]; // Содержит элементы стека.
    int tos; // Индекс вершины стека.

public:
    cStack() {tos = 0;} // Инициализирует стек.
    void push(T ob); // Заталкивает объект в стек.
    T pop(); // Выталкивает объект из стека.
}


// Заталкивает объект в стек.
template <typename T>
void cStack<T>::push(T ob)
{
    if(tos == SIZE)
    {
        wcout << L"Стек полон!" << endl;
        return;
    }

    stack[tos] = ob;
    tos++;
}

// Выталкивает объект из стека.
template <typename T>
T cStack<T>::pop()
{
    if (tos == 0)
    {
        wcout << L"Стек пуст!" << endl;
        return 0;
    }

    tos--;
    return stack[tos];
}


Теперь требуется сделать явную специализацию этого класса для работы с типом int. С объявлением класса специализации проблем не возникает, т.к. Шилдт показал как это можно сделать:

Код

// Создается специализация шаблонного класса cStack для типа int.
template<>
class cStack<int>
{
    int stack[SIZE]; // Содержит элементы стека.
    int tos; // Индекс вершины стека.

public:
    cStack() {tos = 0; wcout << L"Специализация класса cStack для типа int..." << endl;} // Инициализирует стек.
    void push(int ob); // Заталкивает объект в стек.
    int pop(); // Выталкивает объект из стека.
};


Остается непонятным синтаксис определения вне объявления класса-специализации методов push и pop. Пытался разобраться с этим методом тыка, но что-то не получилось, - компилятор постоянно ругается и видимо не понимает что я от него хочу. Покажите, плиз, как определять методы класса-специализации вне объявления этого класса...

З.Ы: Не обращайте внимание на то, что в приведенном коде по сути не требуется явное задание класса-специализации для типа int, т.к. функциональность у них тут по сути одинаковая. Это сейчас не важно.

Это сообщение отредактировал(а) OlegSK - 7.2.2011, 21:28
PM MAIL   Вверх
volatile
Дата 7.2.2011, 23:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Во первых точку с запятой после класса надо ставить!


Цитата(OlegSK @  7.2.2011,  21:26 Найти цитируемый пост)
Покажите, плиз, как определять методы класса-специализации вне объявления этого класса

В вашем случае:
Код

// !!темплейт не нужен!!
void cStack<int>::push(int ob)
{
    
//....
}

И его в .cpp (не в .h)


Это сообщение отредактировал(а) volatile - 7.2.2011, 23:32
PM MAIL   Вверх
OlegSK
Дата 8.2.2011, 00:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 17.7.2010

Репутация: нет
Всего: нет



volatile, благодарю за помощь! Получилось! Я и сам пробовал так делать, но не догадался не использовать template, и перед определением методов класса-специализации указывал template<> из-за которого и ругался компилятор...


Цитата(volatile @  7.2.2011,  23:30 Найти цитируемый пост)
Во первых точку с запятой после класса надо ставить!

Сорри, не заметил когда набивал код... В коде приложения этой ошибки нет.

Это сообщение отредактировал(а) OlegSK - 8.2.2011, 00:56
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0619 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.