Форум программистов, компьютерный форум CyberForum.ru

Шаблоны и раздельная компиляция - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
Сергей_009
0 / 0 / 0
Регистрация: 04.07.2011
Сообщений: 3
04.07.2011, 19:04     Шаблоны и раздельная компиляция #1
Здравствуйте!
Если просто я пишу класс, например:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Test
{
  private:
    int *pm;
    ...
  public:
    bool inc();
    ...
};
 
bool Test::inc()
{
  ...
  return true;
}
 
....
Test ctest;
...
bool bx = ctest.inc()
...
То все работает нормально, но когда я добавляю шаблон, в данном случае будет выглядеть:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
template<class T> class Test
{
  private:
    T *pm;
    ...
  public:
    bool inc();
    ...
};
 
template<class T> bool Test<T>::inc()
{
  ...
  return true;
}
 
....
Test<int> ctest;
...
bool bx = ctest.inc()
...
На последней описанной команде при компиляции выдает ошибку:

undefined reference to `Test<int>::inc()'

Подскажите кто знает, почему получается такая ошибка и как правильно подобное написать.
Использую в качестве компилятора mingw-get-inst-20110530, а в качестве среды codeblocks-10.05.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.07.2011, 19:04     Шаблоны и раздельная компиляция
Посмотрите здесь:

Раздельная компиляция ошибка LNK2019 C++
C++ Раздельная компиляция
Раздельная компиляция файлов C++
раздельная компиляция C++
Раздельная компиляция и шаблоны C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nameless
Эксперт C++
 Аватар для nameless
289 / 288 / 14
Регистрация: 16.06.2009
Сообщений: 486
04.07.2011, 19:24     Шаблоны и раздельная компиляция #2
Сергей_009, Если у Вас описание и реализация шаблона в разных файлах, то для генерации тела функции inc компилятор должен одновременно видеть ее тело и тип, которым оно инстанцируется. Если inc в другом файле, компилятор не видит ее тела. Если перенести описание в *.h файл, то компилятор будет видеть все, что нужно для генерации..

Так же можно явно конкретизировать шаблон:

C++
1
template class Test <int>;
Сергей_009
0 / 0 / 0
Регистрация: 04.07.2011
Сообщений: 3
04.07.2011, 19:42  [ТС]     Шаблоны и раздельная компиляция #3
Спасибо за ответ. Я хотел разделить описание в .h файл, реализацию в .cpp, когда перенес реализацию в .h файл все заработало.
Но тогда остается непонятным, как у стандартных библиотек, которые используют шаблоны калссов описание и реализация разделены и при этом все работает.
bigredcat
364 / 311 / 3
Регистрация: 24.02.2011
Сообщений: 1,512
Записей в блоге: 1
05.07.2011, 10:50     Шаблоны и раздельная компиляция #4
Цитата Сообщение от Сергей_009 Посмотреть сообщение
Но тогда остается непонятным, как у стандартных библиотек, которые используют шаблоны калссов описание и реализация разделены и при этом все работает.
Покажите, где это так.
Сергей_009
0 / 0 / 0
Регистрация: 04.07.2011
Сообщений: 3
05.07.2011, 15:15  [ТС]     Шаблоны и раздельная компиляция #5
Я изучал C++ в прошлом веке еще тогда хоть шаблоны уже были, но о стандартных библиотеках использующих шаблоны я что-то не слышал. Сейчас посмотрел файлы с расширением .h на примере для библиотеки vector, там действительно не только описание, но и реализация в их подключаемых библиотеках, а я думал, что для них также описание в .h файле, а реализация отдельно в библиотеке.
Так что я сам ошибся.
aiwprton805
 Аватар для aiwprton805
64 / 64 / 23
Регистрация: 30.03.2013
Сообщений: 178
Завершенные тесты: 1
08.01.2016, 13:02     Шаблоны и раздельная компиляция #6
Кто-нибудь знает, в Visual Studio 2015 такое разделение работает? Или всё равно надо реализацию в .h пихать?
Yandex
Объявления
08.01.2016, 13:02     Шаблоны и раздельная компиляция
Ответ Создать тему
Опции темы

Текущее время: 00:05. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru