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


Автор: OlegSK 7.2.2011, 21:26
Читаю книгу Шилдта, "Полный справочник по 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, т.к. функциональность у них тут по сути одинаковая. Это сейчас не важно.

Автор: volatile 7.2.2011, 23:30
Во первых точку с запятой после класса надо ставить!


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

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

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

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

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


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

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

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