Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Инклюзивная модель компиляции шаблона, как её реализовать? 
V
    Опции темы
baldina
Дата 28.11.2009, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



unicuum, компиляция - разновидность трансляции
 smile ну до чего же тебе скучно наверно...
PM MAIL   Вверх
Леопольд
Дата 30.11.2009, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 3
Всего: 13



Цитата(Lazin @  30.3.2009,  10:55 Найти цитируемый пост)
подключать в заголовочном файле, файл срр(сс) файл нельзя
в данном случае, пример из книги должен был выглядеть так:
Код

#ifndef UTILITIES_H
#define UTILITIES_H
template <class T> int compare(const T&, const T&);
// другие объявления
template <class T> int compare(const T &v1, const T &v2)
{
  if (v1 < v2 ) return -1;
  if (v2 < v1) return 1;
  return 0;
}
#endif

возможно, там имеется ввиду, что файл utilities.cc не является единицей трансляции, то-есть не компилируется компилятором, а просто служит для того, что-бы разделить реализацию и интерфейс шаблона
в этом случае, код из книги будет эквивалентен тому, что я написал smile  

Если это окажется в двух модулях (translation units) то не получим ли мы нарушение ODR? smile
Или же они все по умолчанию линкуются как inline?

Это сообщение отредактировал(а) Леопольд - 30.11.2009, 13:23


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
unicuum
  Дата 30.11.2009, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 16.3.2005
Где: Рашка

Репутация: нет
Всего: 8



Цитата(Леопольд @  30.11.2009,  13:06 Найти цитируемый пост)
Или же они все по умолчанию линкуются как inline?

Что-то я читал такое, у Страуструпа что ли, вот поиском нашёл примерное тоже самое.

Цитата(http://window.edu.ru/window_catalog/pdf2txt?p_id=13045&p_page=3)

Компонентные функции класса могут быть определены как в теле класса
(такой способ использован во всех приведенных примерах), так и за телом класса
на внешнем уровне программы. Для методов класса, определенных внутри тела
класса, компилятор применяет модификатор inline, то есть объявляет такие мето-
ды встраиваемыми (подставляемыми) функциями.
 Таким образом, на эти функции
накладываются ограничения, аналогичные ограничениям для inline-функций (не
могут содержать циклов, оператор-переключатель и оператор безусловного пере-
хода, не могут быть рекурсивными и т.д.). Если метод класса определен в теле
класса и не удовлетворяет какому-либо из перечисленных условий (например, со-
держит оператор цикла for), то компилятор транслирует данный метод как обыч-
ную, не подставляемую функцию, при этом выводя предупреждение времени
компиляции (в BC++ v5.02 «Functions containing for are not expanded inline»). Для
компонентных функций, определенных вне тела класса, никаких ограничений не
существует, подставляемыми по умолчанию они не объявляются и предупрежде-
ний при их компиляции не возникает.
      При объявлении метода вне тела класса внутри класса помещается лишь
прототип метода, а на внешнем уровне программы вслед за объявлением класса
помещается определение функции в виде:


В любом случае несмотря на сарказм mes'а, раз возникают различные уточнения и вопросы, тема отнюдь не может считаться закрытой.

Добавлено через 1 минуту и 50 секунд
В общем, проверять надо, как ведут себя шаблоны классов и функций.


--------------------
user posted image
обычный день на винграде
PM   Вверх
Леопольд
Дата 30.11.2009, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 3
Всего: 13



Цитата(unicuum @  30.11.2009,  14:18 Найти цитируемый пост)
http://window.edu.ru/window_catalog/pdf2txt?p_id=13045&p_page=3

Похоже на книжку Подбельского. Чур меня...

Цитата(unicuum @  30.11.2009,  14:18 Найти цитируемый пост)
Таким образом, на эти функции
накладываются ограничения, аналогичные ограничениям для inline-функций (не
могут содержать циклов, оператор-переключатель и оператор безусловного пере-
хода, не могут быть рекурсивными и т.д.).

Согласен, рекурсию встроить в место вызова не то что-бы сложно, но как то не соответсвует идеологии самой рекурсии. Её нет смысла встраивать... Однако почему нельзя встраивать циклы, case'ы и goto (который скорее всего не может выпрыгнуть наружу, точно не знаю, никогда не пользовался), для меня загадка...
Я что-то подобное (причём так-же, совершенно без объянений) видел у вышеупомянутого Подбельского. Кол ему в зад. smile

Добавлено @ 14:36
Цитата(unicuum @  30.11.2009,  14:18 Найти цитируемый пост)
вот поиском нашёл примерное тоже самое.

Однако, можно определить метода шаблона вне тела. Как для обычного класса. Однако, если это будет нешаблонный класс, то не inline функции придётся определять в одном единственном модуле, если же их объявить в том же самом заголовочном файле, то при включении этого файла в два компилируемых *.cpp файла проекта их определения попадут в несколько модулей и мы получим нарушение ODR (One Definition Rule)

Это сообщение отредактировал(а) Леопольд - 30.11.2009, 14:38


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
unicuum
Дата 30.11.2009, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 16.3.2005
Где: Рашка

Репутация: нет
Всего: 8



Цитата(Леопольд @  30.11.2009,  14:31 Найти цитируемый пост)
Я что-то подобное (причём так-же, совершенно без объянений) видел у вышеупомянутого Подбельского. Кол ему в зад.

Наверное всё же надо разобраться вначале с этим:
Цитата(zim22 @  30.3.2009,  10:45 Найти цитируемый пост)
Это пример с книжки "Язык программирования С++. Вводный курс. 4 издание." (Липпман, Лажойе, Му).

С источником вдохновения данной темы.


--------------------
user posted image
обычный день на винграде
PM   Вверх
bsa
Дата 30.11.2009, 16:55 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(Леопольд @  30.11.2009,  14:31 Найти цитируемый пост)
Однако почему нельзя встраивать циклы, case'ы и goto (который скорее всего не может выпрыгнуть наружу, точно не знаю, никогда не пользовался), для меня загадка...
Это ограничение компиляторов от Borland. Видимо, в жизни автора другие не попадались.

PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1327 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.