![]() |
|
Модераторы: bsa |
![]()
|
|
| zim22 |
|
||||||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
Как правильно компилить шаблоны? Нужно ли в h-файл инклудить cpp файл в конце?
Компилятор ругается: foo.cpp(2) : error C2143: syntax error : missing ';' before '<' Foo.h
Foo.cpp
main.cpp
Это сообщение отредактировал(а) zim22 - 30.3.2009, 10:33 |
||||||
|
|||||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 27 Всего: 154 |
ну и напишут-же... ну еще-бы, откуда он узнает о существовании класса Foo? Добавлено через 57 секунд напиши все в заголовочном файле, и будет тебе счастье... |
|||
|
||||
| IKM2007 |
|
|||
![]() Зима близко ![]() ![]() Профиль Группа: Участник Сообщений: 702 Регистрация: 26.4.2008 Где: olmedreca Репутация: 3 Всего: 40 |
Шаблоны нужно реализовать в одном файле. Напиши все в файле .h.
-------------------- "К чёрту обстоятельства, я создаю возможности." Брюс Ли |
|||
|
||||
| zim22 |
|
||||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
Это пример с книжки "Язык программирования С++. Вводный курс. 4 издание." (Липпман, Лажойе, Му). Так в ней учат программировать. Вот текст: В инклюзивной модели компиляции компилятору должны быть доступны определения всех используемых шаблонов. Как правило, чтобы сделать определения доступными, в файл заголовка, содержащий объявление шаблона функции или класса, добавляют директиву #include. Эта директива подключает файл(файлы) исходного кода, который содержит соответсвующие определения. А вот приведённый исходный код: // файл заголовка utilities.h
// реализация файла utilities.cc
Так что, так делать не надо, как они "учат"? %) |
||||
|
|||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 27 Всего: 154 |
подключать в заголовочном файле, файл срр(сс) файл нельзя
в данном случае, пример из книги должен был выглядеть так:
возможно, там имеется ввиду, что файл utilities.cc не является единицей трансляции, то-есть не компилируется компилятором, а просто служит для того, что-бы разделить реализацию и интерфейс шаблона в этом случае, код из книги будет эквивалентен тому, что я написал |
|||
|
||||
| zim22 |
|
|||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
||||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 27 Всего: 154 |
||||
|
||||
| p51x |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 19.12.2008 Репутация: нет Всего: нет |
||||
|
||||
| zim22 |
|
|||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
А всё-таки, как разделить интерфейс шаблона от его реализации? Никак?
При создании своего класса(не шаблонного) я объявления в h файл кидаю, а реализацию в cpp. ***** Я кажется понял. Можно в h-файле сначала объявить только методы. А уже в самом конце h-файла их определить Это сообщение отредактировал(а) zim22 - 30.3.2009, 11:42 |
|||
|
||||
| baldina |
|
||||||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
Ты правильно понял. Есть еще одна возможность - принудительная генерация по шаблону. И вообще, учитывая, что для компиляции данного фрагмента кода не всегда обязательно иметь полное описание (например, если используется только указатель на переменную типа, достаточно объявить тип без подробностей), можно значительно уменьшить связи в программе. Вот пример (немного искусственный, только для демонстрации технологии):
|
||||||||||||
|
|||||||||||||
| zim22 |
|
||||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
baldina, я не понимаю, как оно работает.
Вот у меня главный файл например:
Вместо #include подключим содержимое соответствующих файлов, чтобы наглядней было:
Как файл f.cpp компилится? Ведь в нём нет определения шаблона my_min. |
||||
|
|||||
| baldina |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
точно так же, как и при вызове нешаблонных функций. создается внешняя ссылка, которая удовлетворяется в процессе линковки. вот здесь
вызов функции my_min<A>(). Встраивания не происходит, но как вызов extern функции это вполне законно. в том коде, что я написал есть ошибка: шаблону min() надо знать про оператор < вот так:
|
||||||||
|
|||||||||
| zim22 |
|
|||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
baldina, спасибо.
|
|||
|
||||
| unicuum |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 830 Регистрация: 16.3.2005 Где: Рашка Репутация: нет Всего: 8 |
Хотелось бы уточнить некоторые моменты для начала. Вот это получается объявление шаблона функции.
А это по логике вещей определение шаблона функции.
Логика проистекает из определения, шаблоны это функции или классы определяемые без явного указания одного или нескольких типов. В обычных функциях вроде так всё и устроено. Если неправильно мыслю поправьте. Далее файлы со следующими расширениями (*.h, *.hpp, *.hxx, *.hh) - заголовочные: Как правило содержат объявления (прототипы). А вот с таким расширением (*.cpp, *.cxx, *.cc) - единицы компиляции, в книге написано именно так, а не трансляции. Для каждой единицы компиляции компилируется в Windows *.obj, в Unix и MacOS X *.o файлы, которые затем компонуются. Заголовочные файлы объявляются вначале единиц компиляции для синтаксического анализа компилятору. Вот теперь можно перейти к теме - "инклюзивная модель компиляции шаблона". Взять хотя бы примеры baldina, почему они написаны так, а не иначе? -------------------- ![]() обычный день на винграде |
||||
|
|||||
| mes |
|
||||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
а Вам не кажется, что тема успела разрешиться до того как Вы дали разрешение ее продолжать
можно и по другому, примеры показательные и в них авторы пытались донести суть какого либо момента, стараясь чтоб получилось наиболее понятно.
во первых не сами файлы, а их содержимое со всеми включениями. во вторых в книжках пишут по разному
http://lib.mexmat.ru/books/31673/s2 |
||||||||
|
|||||||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |