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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.10.2013, 11:35   #11
valeologiya
Пользователь
 
Регистрация: 07.07.2009
Сообщений: 37
По умолчанию

Уважаемые читатели этого форума. Пишу для тех, кто столкнется с той же проблемой. Все оказалось гораздо сложнее, чем казалось. Перестановка местами файлов - не решение проблемы.
По описанию языка С++ во многих книгах в случае, если вы хотите отделить объявление шаблона от его определения нужно применять ключевое слово export. Однако, на практике эту возможность поддерживает очень малое количество компиляторов. В частности, компилятор mingw эту возможность не поддерживает.
Все программисты, которые сталкивались с шаблонами на практике, а не в теории рекомендуют одно и то же: "при написании шаблона класса его реализация должна помешаться в заголовочном файле или встраиваемом файле, который подключается заголовочным"
Обсуждение проблемы на другом форуме
Книга "Сборник рецептов по С++", смотреть главу 8.11.

Последний раз редактировалось valeologiya; 29.10.2013 в 11:35. Причина: выделение жирным главного
valeologiya вне форума Ответить с цитированием
Старый 29.10.2013, 16:06   #12
still_alive
Great Code Monkey
Форумчанин
 
Аватар для still_alive
 
Регистрация: 09.08.2007
Сообщений: 533
По умолчанию

Цитата:
Нужно просто в файле проекта переставить местами main.cpp и сa737decoder.cpp.
Не понял, какую проблему это должно было решить? Все равно нет единиц трансляции, где доступны и аргументы шаблона, и определение шаблона.

Цитата:
По описанию языка С++ во многих книгах в случае, если вы хотите отделить объявление шаблона от его определения нужно применять ключевое слово export. Однако, на практике эту возможность поддерживает очень малое количество компиляторов.
Верно. Фтопку экспорт.

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

Есть еще один способ - явное инстанцирование. Используется для уменьшения времени компиляции, поскольку при нем уменьшается общее кол-во инстанцирований. Все явные инстанцирования обычно помещаются в отдельную библиотеку. Но в связи с усложнением поддержки кода, этот способ применяется куда реже.
still_alive вне форума Ответить с цитированием
Старый 30.10.2013, 00:00   #13
valeologiya
Пользователь
 
Регистрация: 07.07.2009
Сообщений: 37
По умолчанию

still_alive, я бы обязательно догадался, если бы знал как работает компилятор. Для меня кажется вполне логичным, что если я скормил определение класса компилятору перед его использованием, то он уж как-нибудь сам разберется как это скомпилировать. Посоветуй, пожалуйста, литературу. Чтобы там слова "единица трансляции" тоже присутствовали.

В случае с явным инстанцированием два вопроса:
1) если используется модель компиляции с разделением, означает ли это что я смогу применить шаблон только для типов ( или значений шаблонной переменной), которые прошли явное инстанцирование? А если подставлю в шаблон другой тип, напорюсь на те же грабли.
2) как вообще собираются библиотеки шаблонов? Допустим, std::vector, я же могу в него любой тип подставить. И что, значит в заголовочном файле <vector> содержится весь код вектора? И каждый раз собирается? Тогда, мама дорогая, я пересмотрю свои взгляды на использование контейнеров. Это поражает мое воображение.
valeologiya вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с шаблонами. Программа не компилирует. Даша1046 Помощь студентам 2 03.07.2013 19:53
Ошибка компиляции Selean Общие вопросы C/C++ 2 26.03.2013 08:18
Ошибка работы программы. Работа с библиотекой STL и шаблонами. С ++ Vasyl'eva Помощь студентам 1 25.12.2011 18:39
Программа для отправки писем (ошибка компиляции) Ёжик в тумане Работа с сетью в Delphi 2 22.10.2011 12:58
C++ ошибка компиляции Seil_29 Помощь студентам 9 20.12.2009 22:23