Название: Шаблоны типа. Отправлено: Alexeyy от Апрель 03, 2011, 18:56 Пытаюсь написать класс очереди с использованием шаблона типа.
list.h Код: #ifndef LIST_H list.cpp Код: #include "list.h" main.cpp Код: #include <QtGui/QApplication> Ошибка: undefined reference to `list<int>::list()' заранее спасибо за помощь :) Название: Re: Шаблоны типа. Отправлено: Fat-Zer от Апрель 03, 2011, 19:19 всё пиши в хедере, и объявления и реализацию
Название: Re: Шаблоны типа. Отправлено: Alexeyy от Апрель 03, 2011, 19:20 А эту проблему никак решить нельзя?
Название: Re: Шаблоны типа. Отправлено: Fat-Zer от Апрель 03, 2011, 19:21 А эту проблему никак решить нельзя? какая ещё проблема?Название: Re: Шаблоны типа. Отправлено: Alexeyy от Апрель 03, 2011, 19:36 Во всех книжках написано что так можно. => я где-то допустил ошибку. Вот и хочу ее найти.
Название: Re: Шаблоны типа. Отправлено: Fat-Zer от Апрель 03, 2011, 19:44 Во всех книжках написано что так можно. => я где-то допустил ошибку. Вот и хочу ее найти. нет, так нельзя. во всех книжках написано, что определение шаблона должно быть видимо в месте его конкретизации.В теории, это можно сделать с помощью ключевого слова export в определениях, но пока ни один компилятор его не поддерживает. Название: Re: Шаблоны типа. Отправлено: Alexeyy от Апрель 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 - имя конструктора. Название: Re: Шаблоны типа. Отправлено: Fat-Zer от Апрель 03, 2011, 20:23 тут он пишет, что они могут определяться снаружи класса.
где про конкретизацию написано у Страуструпа я на вскидку не нашёл. Могу отослать к Липману "язык программирования С++. вводный курс. третье издание" глава 16.8 Шаблоны классов и модель компиляции. Название: Re: Шаблоны типа. Отправлено: Fat-Zer от Апрель 03, 2011, 21:08 Да ещё... если так хочется засунуть реализацию в отдельный файл, то можно его заинклюдить в конец хедера.
Название: Re: Шаблоны типа. Отправлено: Alexeyy от Апрель 04, 2011, 15:24 16.8.2. Модель компиляции с разделением.
Этот пункт из книги про которую вы говорили там написано, что так делать можно. Название: Re: Шаблоны типа. Отправлено: Alexeyy от Апрель 04, 2011, 15:30 Все понял свою ошибку спасибо большое.
|