Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
1

Шаблоны в header и cpp

28.10.2015, 22:54. Просмотров 1936. Ответов 11
Метки нет (Все метки)

Столкнулся с такой проблемой- пишу инлайн шаблонный предикат в хедер.х ) затем объявляю шаблонизированую ф-цию, затем реализую эту ф-цию уже в срр файле. Компилятор (визуал) не может создать ее инстанс. Перемещаю в реализацию в хедеры- все тип-топ. В чем дело? На мой вопрос препод заявил что надо почитать стандарт, потом сказал что стандарт предусматривает шаблонные прототипы.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.10.2015, 22:54
Ответы с готовыми решениями:

С помощью командной строки >namberstr f1.cpp Определить число строк в файле с именем f1.cpp
С помощью командной строки >namberstr f1.cpp Определить число строк в файле с именем f1.cpp

Подключение файлов main.cpp some.cpp some.h
Всем привет, программа разделенна на три файла poly.cpp main.cpp poly.h Кто мог бы объяснить как...

Библиотеки в CPP. Ошибка компиляции | CPP
Доброго вечера! Появился один вопросик недавно. Начал юзать библиотеку <windows.h> для...

C:\tsserver\Projects\cpp\codeblocks\MyComp\compiler\mmz\mmz. cpp|29|error: no match for 'operator=' in '* Item = * Source'|
char **Source; TArray<std::string> *Item; ... *Item=*Source;

11
Эксперт С++
8311 / 3870 / 840
Регистрация: 15.11.2014
Сообщений: 8,763
28.10.2015, 22:56 2
Цитата Сообщение от anti-k Посмотреть сообщение
На мой вопрос препод заявил что надо почитать стандарт
это - мудро, хотя и бесполезно в вашем случае.

Цитата Сообщение от anti-k Посмотреть сообщение
потом сказал что стандарт предусматривает шаблонные прототипы.
это уже избыточно.
не разумеющий хотьбы да не услышет бегающего.
1
Don't worry, be happy
16956 / 9832 / 1895
Регистрация: 27.09.2012
Сообщений: 24,382
Записей в блоге: 2
28.10.2015, 22:59 3
Цитата Сообщение от anti-k Посмотреть сообщение
затем объявляю шаблонизированую ф-цию, затем реализую эту ф-цию уже в срр файле.
определение шаблона должно быть доступно в месте инстанцирования.

Добавлено через 3 минуты
Цитата Сообщение от hoggy Посмотреть сообщение
это - мудро, хотя и бесполезно в вашем случае.
ну мало ли. Частенько же цитаты из стандарта помогают
1
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
28.10.2015, 23:02  [ТС] 4
Croessmah, Спасибо!

Добавлено через 1 минуту
hoggy, Я не понял ни вас ни препода, увы(
0
Don't worry, be happy
16956 / 9832 / 1895
Регистрация: 27.09.2012
Сообщений: 24,382
Записей в блоге: 2
28.10.2015, 23:03 5
Цитата Сообщение от anti-k Посмотреть сообщение
Я не понял ни вас ни препода
значит нужно
Цитата Сообщение от anti-k Посмотреть сообщение
почитать стандарт
и учебники
1
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
28.10.2015, 23:07  [ТС] 6
Croessmah,А вас я как раз понял )или это мне показалось
0
13881 / 7417 / 1759
Регистрация: 30.01.2014
Сообщений: 12,409
29.10.2015, 09:49 7
Лучший ответ Сообщение было отмечено anti-k как решение

Решение

Цитата Сообщение от anti-k Посмотреть сообщение
В чем дело?
Шаблон - это описание правил, по которым компилятор может сгенерировать код (провести инстанцирование). Т.к. в С++ раздельная компиляция (это значит, что каждый файл (единица трансляции) компилируется отдельно и независимо), в каждой конкретной единице трансляции, где требуется инстанцирование, должно быть доступно полное определение шаблона. Поэтому такое разбиение на разные файлы и не работает.
Эту особенность ранее предлагалось преодолевать с помощью фичи "экспорт шаблонов", которая была реализована в полном объеме только тут (реализация этого здорово усложняла компилятор, поэтому другие производители либо не стали связываться, либо делали частичные экспериментальные реализации). Как обычно, проблема решалась введением доп. уровня косвенности (в виде генерации компилятором спец. файлов с метаинформацией об экспорте). Начиная с С++11 эта возможность удалена из языка, ключевое слово export зарезервировано для будущих изменений.
С.2.7 Clause 14: templates
Change: Remove export
Rationale: No implementation consensus.
Effect on origin feature: A valid C++ 2003 declaration containing export is ill-formed in this International Standard.
PS.
Вообще говоря, эта тема много раз обсуждалась здесь и эти моменты объяснялись. В проф. навыки любого программиста также входит и умение искать информацию самостоятельно. Не стоит пренебрегать обучением этому сейчас, т.к. потом будет некогда учиться.
2
Tulosba
29.10.2015, 11:29
  #8

Не по теме:

Цитата Сообщение от DrOffset Посмотреть сообщение
т.к. потом будет некогда учиться.
Учиться никогда не поздно. Лучше, конечно, раньше и на чужих ошибках :)

0
DrOffset
29.10.2015, 13:13
  #9

Не по теме:

Цитата Сообщение от Tulosba Посмотреть сообщение
Учиться никогда не поздно.
Я не сказал поздно. Я сказал некогда. Работа (задачу решать надо, а не разбираться почему шаблон не компилируется), семья, дети и т.п.

0
Tulosba
29.10.2015, 14:04
  #10

Не по теме:

Цитата Сообщение от DrOffset Посмотреть сообщение
дети
Тоже, по сути, результат инстанцирования шаблона :D

0
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
29.10.2015, 14:19  [ТС] 11
Tulosba,
0
Croessmah
29.10.2015, 16:41     Шаблоны в header и cpp
  #12

Не по теме:

Цитата Сообщение от Tulosba Посмотреть сообщение
Тоже, по сути, результат инстанцирования шаблона
с последующим рефакторингом:D

0
29.10.2015, 16:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.10.2015, 16:41
Привет! Вот еще темы с ответами:

Вот: source_file.cpp: In function 'int main()': source_file.cpp:10:12: error: 'strlen' was not declared in this scope
#include<iostream> using namespace std; int main() { char a,b; int i,j; cout<<"Напишите...

Разделение программы на .h .cpp .cpp
Никак не пойму как правильно разделять программу на несколько файлов. Вот код : ( в чем...

Использовать void из 1.cpp в 2.cpp
Допустим, есть функция void Hello(). Она в файле 1.cpp. Мне нужно её использовать в файле 2.cpp, но...

Не могу исправить ошибку :113 H:\Dev-Cpp\Проекты\уроки\Безымянный3.cpp cannot convert `IDirectDraw7**' to `IDirectDraw**' for argument `2' to `HRESULT DirectDrawCreate(GUID*, IDirectDraw**, IUnknown*)
Недавно начал изучать оконные программы и работу с DirectX. Но при написании программы столкнулся...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.