Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
DevAlone
324 / 276 / 78
Регистрация: 02.08.2016
Сообщений: 1,008
Завершенные тесты: 4
#1

Раздельная компиляция шаблонов классов - C++

08.03.2017, 17:13. Просмотров 268. Ответов 7
Метки нет (Все метки)

При разделении шаблона класса на .h и .cpp линковщик ругается. Неужели в C++17 ещё не пофиксили это недоразумение и придётся писать всё в одном файле?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.03.2017, 17:13
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Раздельная компиляция шаблонов классов (C++):

Экспорт шаблонов функций/методов и раздельная компиляция
Возможен ли он в настоящее время? Если да, то как грамотно реализовать? Если...

Создание классов в С++. Раздельная компиляция
При создании класса C++ в VS создается два файла, "<имя_класса>.h" и...

Раздельная модель компиляции шаблонов
Иншаллах, парни. В одной книжке (имя которой я сказать не могу) идет речь о...

раздельная компиляция
Вот есть три файла: заголовочный файл с классом (.h), файл с реализацией...

Раздельная компиляция
Пусть есть программа, которая состоит из 2 файлов. 1 файл: основной, там где...

Раздельная компиляция
Здравствуйте, я перечитал на форуме информацию по этой теме, но пока что не...

7
zss
Модератор
Эксперт С++
6960 / 6522 / 4139
Регистрация: 18.12.2011
Сообщений: 17,209
Завершенные тесты: 1
08.03.2017, 18:21 #2
а как Вы себе это представляете?
из шаблона нельзя сгенерировать код до тех пор. пока нет его инстанцирования.
1
GbaLog-
Любитель чаепитий
3156 / 1462 / 462
Регистрация: 24.08.2014
Сообщений: 5,180
Записей в блоге: 1
Завершенные тесты: 2
08.03.2017, 18:35 #3
http://www.cyberforum.ru/post9488987.html

А вообще, можно разделить, но просто придется по другому инклудить:
C++
1
2
3
4
5
//foo.hpp
template<typename Tp>
void foo(Tp);
 
#include "foo.tcc"
C++
1
2
3
4
//foo.tcc
template<typename Tp>
void foo(Tp)
{}
C++
1
2
3
4
5
6
7
//main.cpp
#include "foo.hpp"
 
int main()
{
  foo(1); 
}
Цитата Сообщение от DevAlone Посмотреть сообщение
Неужели в C++17 ещё не пофиксили это недоразумение
Нет.
1
nd2
2828 / 2398 / 1054
Регистрация: 29.01.2016
Сообщений: 8,022
08.03.2017, 18:47 #4
Или так (чтобы уж совсем отдельно):
C++
1
2
3
4
5
6
//main.cpp
#include "foo.hpp"
#include "foo.tcc"
 
int main()
{ foo(1); }
Или так:
C++
1
2
3
4
5
6
7
//main.cpp
#include "foo.hpp"
 
int main()
{ foo(1); }
 
#include "foo.tcc"
Но как ни крути, всё равно всё должно быть в одной единице трансляции, т.е., раздельной компиляцией это не назовёшь.
1
hoggy
Заблокирован
09.03.2017, 01:44 #5
Цитата Сообщение от DevAlone Посмотреть сообщение
Неужели в C++17 ещё не пофиксили это недоразумение
фиксят ошибки.
в данном случае никаких недоразумений нет.

Цитата Сообщение от DevAlone Посмотреть сообщение
придётся писать всё в одном файле?
если хотите предоставить клиентам шаблон - да.
1
rikimaru2013
C++ Game Dev
2471 / 1140 / 348
Регистрация: 30.11.2013
Сообщений: 3,709
09.03.2017, 01:51 #6
DevAlone, так в той крутой ссылке есть пример крутой фичи в .h определить функции
C++
1
2
3
4
5
6
void FooTemplateTrick()
{
 Foo<int>();
 Foo<char>();
 Foo<float>();
}
1
DevAlone
324 / 276 / 78
Регистрация: 02.08.2016
Сообщений: 1,008
Завершенные тесты: 4
09.03.2017, 01:55  [ТС] #7
такой себе способ, а вдруг надо будет ещё что-то? Не генерить же тонну определений?)
0
rikimaru2013
C++ Game Dev
2471 / 1140 / 348
Регистрация: 30.11.2013
Сообщений: 3,709
09.03.2017, 02:08 #8
DevAlone, ну эта крутая фича с функцией-фейком в .h не пройдет код-ревью) Это так - если очень хочется!
1
09.03.2017, 02:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.03.2017, 02:08
Привет! Вот еще темы с решениями:

Раздельная компиляция
В Гугле не забанен,нашел описание самого принципа,но конкретных примеров не...

Раздельная компиляция и шаблоны
Есть 3 файла с кодом: 1) foo.hpp template&lt;typename T&gt; class foo { public:...

Шаблоны и раздельная компиляция
Здравствуйте! Если просто я пишу класс, например: class Test { private:...

Раздельная компиляция и шаблоны
привет. возьму вот такой выдуманный пример #ifndef CCLASS_H #define...


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

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

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