Russian Qt Forum
Ноябрь 23, 2024, 22:33 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Шаблоны типа.  (Прочитано 4087 раз)
Alexeyy
Гость
« : Апрель 03, 2011, 18:56 »

Пытаюсь написать класс очереди с использованием шаблона типа.

list.h
Код:
#ifndef LIST_H
#define LIST_H


template <class T>
class list
{
public:
    struct list_node // Узел списка состоит из имени и ссылки на предидущий элемент
    {
        T name;
        list_node* prev;
    };
    list();
    void push(T);//Добавление в очередь
    T pop();//Извлечение из очереди
    void clear();//очистка очереди

private:
    list_node * head, * end;
    int count;
};

#endif // LIST_H

list.cpp
Код:
#include "list.h"


template <class T> list<T>::list()
{
    head=end=0;
    count=0;
}

template <class T> void list<T>::push(T new_elem)
{
    list_node* temp = new list_node;//создаем новый элемент и выделяем под него память
    temp->name = new_elem;
    temp->prev = 0;
    if(count!=0)
    {
        end->prev = temp;
        end = temp;
    }
    else
        end=head=temp;
    count++;
}

template <class T> T list<T>::pop()
{
    list_node* temp = new list_node;
    temp=head;
    head=head->prev;
    T deleted;
    deleted = temp->name;
    delete temp;
    count--;
    return deleted;
}

template <class T> void list<T>::clear()
{
    while(head!=0)
        pop();
}

main.cpp
Код:
#include <QtGui/QApplication>
#include "widget.h"
#include "list.h"

int main(int argc, char *argv[])
{
    list<int> new_list;
}

Ошибка: undefined reference to `list<int>::list()'

заранее спасибо за помощь  Улыбающийся
Записан
Fat-Zer
Гость
« Ответ #1 : Апрель 03, 2011, 19:19 »

всё пиши в хедере, и объявления и реализацию
Записан
Alexeyy
Гость
« Ответ #2 : Апрель 03, 2011, 19:20 »

А эту проблему никак решить нельзя?
Записан
Fat-Zer
Гость
« Ответ #3 : Апрель 03, 2011, 19:21 »

А эту проблему никак решить нельзя?
какая ещё проблема?
Записан
Alexeyy
Гость
« Ответ #4 : Апрель 03, 2011, 19:36 »

Во всех книжках написано что так можно. => я где-то допустил ошибку. Вот и хочу ее найти.
Записан
Fat-Zer
Гость
« Ответ #5 : Апрель 03, 2011, 19:44 »

Во всех книжках написано что так можно. => я где-то допустил ошибку. Вот и хочу ее найти.
нет, так нельзя. во всех книжках написано, что определение шаблона должно быть видимо в месте его конкретизации.
В теории, это можно сделать с помощью ключевого слова export в определениях, но пока ни один компилятор его не поддерживает.
Записан
Alexeyy
Гость
« Ответ #6 : Апрель 03, 2011, 19:49 »

Бьерн Страуструп. Язык программирования С++
Цитировать
Функции в шаблоне типа могут и не быть подстановками, шаблонный класс stack с полным правом
можно определить и так:
template<class T> class stack {
T* v;
T* p;
int sz;
public:
stack(int);
~stack();
void push(T);
T pop();
int size() const;
};
В этом случае определение функции-члена stack должно быть дано где-то в другом месте, как это и
было для функций- членов обычных, нешаблонных классов. Подобные функции так же
параметризируются типом, служащим параметром для их шаблонного класса, поэтому определяются
они с помощью шаблона типа для функции. Если это происходит вне шаблонного класса, это надо
делать явно:
template<class T> void stack<T>::push(T a)
{
*p++ = a;
}
template<class T> stack<T>::stack(int s)
{
v = p = new T[sz=s];
}
Отметим, что в пределах области видимости имени stack<T> уточнение <T> является избыточным, и
stack<T>::stack - имя конструктора.
Записан
Fat-Zer
Гость
« Ответ #7 : Апрель 03, 2011, 20:23 »

тут он пишет, что они могут определяться снаружи класса.
где про конкретизацию написано у Страуструпа я на вскидку не нашёл. Могу отослать к Липману "язык программирования С++. вводный курс. третье издание" глава 16.8 Шаблоны классов и модель компиляции.
Записан
Fat-Zer
Гость
« Ответ #8 : Апрель 03, 2011, 21:08 »

Да ещё... если так хочется засунуть реализацию в отдельный файл, то можно его заинклюдить в конец хедера.
Записан
Alexeyy
Гость
« Ответ #9 : Апрель 04, 2011, 15:24 »

16.8.2. Модель компиляции с разделением.

Этот пункт из книги про которую вы говорили там написано, что так делать можно.
Записан
Alexeyy
Гость
« Ответ #10 : Апрель 04, 2011, 15:30 »

Все понял свою ошибку спасибо большое.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.047 секунд. Запросов: 21.