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

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

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

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

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

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

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

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

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

7
zss
Модератор
Эксперт С++
7506 / 6864 / 4335
Регистрация: 18.12.2011
Сообщений: 18,174
Завершенные тесты: 1
08.03.2017, 18:21 2
а как Вы себе это представляете?
из шаблона нельзя сгенерировать код до тех пор. пока нет его инстанцирования.
1
GbaLog-
Любитель чаепитий
3167 / 1473 / 465
Регистрация: 24.08.2014
Сообщений: 5,210
Записей в блоге: 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
2838 / 2405 / 1057
Регистрация: 29.01.2016
Сообщений: 8,046
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
2473 / 1141 / 349
Регистрация: 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
2473 / 1141 / 349
Регистрация: 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:...


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

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

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