Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как инстацировать версию шаблона.  (Прочитано 12527 раз)
0 Пользователей и 1 Гость смотрят эту тему.
sss
Специалист

us
Offline Offline

« : 29-09-2009 07:37 » 

Класс объявлен в h, методы класса определены в cpp. Для того что бы не загромождать, показан только конструктор.
Код:
//tree.h

template <class _KeyT> class CTreeItem
{
private:
...
protected:
  _KeyT                       m_Key;

public:
  CTreeItem(void);
};

Код:
//tree.cpp
template<class _KeyT>
CTreeItem<_KeyT>::CTreeItem(void)
                 :m_pParent( NULL), m_pLeft( NULL), m_pRight(NULL),
                  m_Color('b'), m_ulSize(0)
{
}


Вот. Теперь никак не получается использовать, например,  вот такой тип
Код:
//some.h
typedef CTreeItem<double>  CDoubleItem;

так как "Unresolved external  CTreeItem<double>:: CTreeItem<double> ...". Можно решить это, добавив в  tree.h строки для принудительного инстацирования 
Код:
//tree.h

template class CTreeItem<double>;
Но только в tree.h. Но если тип будет не стандартный и вообще, нельзя например править tree.h что тогда? Понятно, если вынести определения методов в h, тоже будет компилиться. Но если я не хочу ? Если я вынесу это будет такое месиво определений и методов - а я привык, что все методы в cpp? Так как можно еще управлять инстацированием?



Записан

while (8==8)
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 29-09-2009 07:49 » 

Можно попробовать использовать директиву export для объявления шаблонного класса. То есть,
Код:
//tree.h

export template <class _KeyT> class CTreeItem
{
};
Или перед конкретными экспортируемыми членами класса.
Стандарт описывает возможность экспорта шаблонов. Вот только компиляторами эта фича плохо держится. Visual Studio 2005 и младше так не умеют, например.
« Последнее редактирование: 29-09-2009 07:51 от Вад » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #2 : 29-09-2009 07:52 » 

sss, а ты сделай и прототип и описание в одном h файле
Записан

sss
Специалист

us
Offline Offline

« Ответ #3 : 29-09-2009 07:57 » 

Вад, не получилось. Все тоже самое.
 Алексей1153++, ни зачто.

Во вычитал в MSDN Visual C++ Language Reference

Цитата
The export keyword is not supported on templates. For example, the following sample will not compile:

export template <class T> void fun(T);
export template <class T> class A;


Я в CBuilder - скомпилился но без толку.
« Последнее редактирование: 29-09-2009 08:00 от sss » Записан

while (8==8)
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 29-09-2009 08:03 » 

Выдержка из стандарта (выделено мной):
Цитата
A non-exported template must be defined in every translation unit in which it is implicitly instantiated (14.7.1), unless the corresponding specialization is explicitly instantiated (14.7.2) in some translation unit; no diagnostic is required. [Note: See also 14.7.2. ] An exported template need only be declared (and not necessarily defined) in a translation unit in which it is instantiated. A function template declared both exported and inline is just inline and not exported.

9 [Note: an implementation may require that a translation unit containing the definition of an exported template be compiled before any translation unit containing an instantiation of that template. ]

Так что, либо через экспорт, либо руками. Если компилятор не вполне соблюдает стандарт, то вариант только один. Увы.

Но если ты привык разделять, заголовок и отдельно реализацию в cpp. Только включать потребуется всё равно cpp, а от заголовка только и пользы, что объявление отделено от реализации.

Я обычно делаю сначала объявление, а реализацию - следом в том же заголовке.
« Последнее редактирование: 29-09-2009 08:07 от Вад » Записан
sss
Специалист

us
Offline Offline

« Ответ #5 : 29-09-2009 08:23 » new

Вад, спасибо. Все OK!!!
Записан

while (8==8)
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 29-09-2009 08:31 » 

sss, в смысле, удалось-таки экспортировать? Если да - на каком компиляторе? Чтобы тоже знать, мало ли Улыбаюсь
Записан
sss
Специалист

us
Offline Offline

« Ответ #7 : 29-09-2009 08:42 » 

Вад, компилятор CBuilder. Я думаю, сам до конца не понимая, ты все правильно сказал !

Вот решение:

Код:
#include "tree.cpp"


Но если ты привык разделять, заголовок и отдельно реализацию в cpp. Только включать потребуется всё равно cpp, а от заголовка только и пользы, что объявление отделено от реализации.

Гениально!
« Последнее редактирование: 29-09-2009 08:47 от sss » Записан

while (8==8)
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 29-09-2009 08:52 » 

А, да. Собственно, мне случалось использовать это решение и не для шаблонов Улыбаюсь Когда требовалось резко снизить время на компиляцию-линковку.
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #9 : 29-09-2009 11:11 » 

А теперь в ЧАВО ея! Ага
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines