Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.05.2010, 00:58   #1
Ozerich
Студент 1 курса
Форумчанин Подтвердите свой е-майл
 
Аватар для Ozerich
 
Регистрация: 27.06.2008
Сообщений: 959
По умолчанию Шаблонный класс

main.cpp
Код:
#include "OziList.h"

int main()
{
	OziList<int> list;
	return 0;
}
OziList.h
Код:
#ifndef OZILIST_H
#define OZILIST_H

template <typename dataType>
class OziList
{
private:
public:
	OziList();
};

#endif
OziList.cpp
Код:
#include <iostream>
#include "OziList.h"


template <typename dataType>
OziList<dataType>::OziList()
{
   std::cout<<"YES";
}
Почему с шаблонами не работает разделение интерфейса от реализации?
C++(STL, QT, WinInet) / DHTML(CSS) / JavaScript / PHP Developer
Ozerich вне форума Ответить с цитированием
Старый 06.05.2010, 01:18   #2
confucius
Пользователь
 
Аватар для confucius
 
Регистрация: 01.05.2010
Сообщений: 15
По умолчанию

Код:
Почему с шаблонами не работает разделение интерфейса от реализации?
Экспорт шаблонов не поддерживается большинством компиляторов, пиши реализацию в заголовочном файле.
confucius вне форума Ответить с цитированием
Старый 06.05.2010, 01:38   #3
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,336
По умолчанию

потому что нужно понимать, как работает компилятор с шаблонами. а то засиделись вы там в своих студиях...

Цитата:
Почему с шаблонами не работает разделение интерфейса от реализации?
для начала нужно понять, как именно оно не работает. компилятор твой код пропустит спокойно, но линковщик пошлет. почему так происходит? для того, чтобы можно было использовать шаблонную функцию (или класс), она (он) должна быть инстанцирована. это примерно тож самое, как создание объекта из класса.

Код:
template <typename dataType>
class OziList
{
private:
public:
	OziList();
};
ты обьявил шаблонный класс с методами без их определения на данной фазе. дальше этого файла компилятор не видит (при инклуде, естессно). но для инстанцирования компилятору нужно знать и файл с определением класса, которого он, к сожалению, не знает. когда ты пишешь

Код:
OziList<int> list;
то шаблон инстанцируется типом int. но инстанцируется только интерфейсная часть! т.е компилятор полагает, что определение где то в другом месте, и дальше разрешить эту проблему должен компоновщик. но при обработке файла OziList.cpp у компилятора нет указания, что нужно инстанцировать это определение шаблона для каких то конкретных аргументов. вот и выходит, что компилится все ок, но линкер шлет. надеюсь правильно объяснил.
как этого избежать? есть несколько моделей инстанцирования. самая популярная скорее всего модель включения (интерфейс и реализация в одном файле). есть также модель явного инстанцирования, при которой создается cpp файл, и в него помещается нечто

Код:
template void foo<int>();
т.е инстанцировали шаблонную функцию для типа int. далее просто компилируешь свой проект с этим файлом, и линковщик уже разрешит зависимости. но если у тебя шаблонный класс, придется описывать все шаблонные методы этого класса, что не очень удобно.
есть еще модель разделения, но ее мало кто из компиляторов поддерживает. gcc например, нет.

если интересно, почитай что нить специализированное по шаблонам, например книгу Вандервуда "Шаблоны С++. Справочник разработчика".
а если нет, то не парься, пиши реализацию в одном файле с интерфейсом.

ничо се, трактат...
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance

Последний раз редактировалось pproger; 06.05.2010 в 01:42.
pproger вне форума Ответить с цитированием
Старый 06.05.2010, 01:48   #4
Ozerich
Студент 1 курса
Форумчанин Подтвердите свой е-майл
 
Аватар для Ozerich
 
Регистрация: 27.06.2008
Сообщений: 959
По умолчанию

pproger, спасибо за объяснения!
Обязательно прочитаю книгу.
C++(STL, QT, WinInet) / DHTML(CSS) / JavaScript / PHP Developer
Ozerich вне форума Ответить с цитированием
Старый 06.05.2010, 01:55   #5
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,336
По умолчанию

2Ozerich
Цитата:
а если нет, то не парься, пиши реализацию в одном файле с интерфейсом.
забыл добавить, что в итоге ты все равно будешь юзать модель включения (скорей всего) но книжка интересная
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 06.05.2010, 02:00   #6
Ozerich
Студент 1 курса
Форумчанин Подтвердите свой е-майл
 
Аватар для Ozerich
 
Регистрация: 27.06.2008
Сообщений: 959
По умолчанию

Значит, тогда лучше все классы писать в одном файле?
C++(STL, QT, WinInet) / DHTML(CSS) / JavaScript / PHP Developer
Ozerich вне форума Ответить с цитированием
Старый 06.05.2010, 02:09   #7
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,336
По умолчанию

2Ozerich
ну можешь оставить как у тебя есть, только измени свой хидер так:
Код:
#ifndef OZILIST_H
#define OZILIST_H

template <typename dataType>
class OziList
{
private:
public:
	OziList();
};

#include "OzList.cpp"

#endif
по сути это та же модель включения. только не забудь о том, что в этом случае OzList.cpp не должен передаваться компилятору на создание объектного файла (ибо по сути он выполняет роль хидера. можно даже дать ему специфическое расширение). ну типо скомпилить в таком случае твой проект можно как g++ main.cpp

а как лучше или хуже я советовать не буду. думаю сам сможешь выбрать, вариантов не много
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 06.05.2010, 02:11   #8
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

можно просто подключать вместо h cpp файл в майне)
NiCola999 вне форума Ответить с цитированием
Старый 06.05.2010, 02:18   #9
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,336
По умолчанию

2NiCola999
Цитата:
можно просто подключать вместо h cpp файл в майне)
с точки зрения компилятора эт то же самое. а вот у неинформированного об этом пользователя возникнет легкое недоумение
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Шаблонный класс Syltan Общие вопросы C/C++ 2 22.11.2009 22:23
C++ . Класс Ануар56 Помощь студентам 8 23.04.2009 19:41
Шаблонный односвязный список _ares_ Общие вопросы C/C++ 4 06.12.2008 21:35
Класс Юлёк Фриланс 6 15.06.2008 15:00