С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
Сергей_009
0 / 0 / 0
Регистрация: 04.07.2011
Сообщений: 3
#1

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

04.07.2011, 19:04. Просмотров 1411. Ответов 5
Метки нет (Все метки)

Здравствуйте!
Если просто я пишу класс, например:
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.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.07.2011, 19:04
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Шаблоны и раздельная компиляция (C++):

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

Раздельная компиляция и шаблоны: как правильно использовать? - C++
Столкнулся с очень неприятной ситуацией, когда один и тот же код не работает, если класс разделить по файлам. #include &lt;iostream&gt; ...

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

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

раздельная компиляция - C++
Вот есть три файла: заголовочный файл с классом (.h), файл с реализацией методов класса (.cpp), и функцию main. Как, корректно, выполнить...

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

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

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

C++
1
template class Test <int>;
1
Сергей_009
0 / 0 / 0
Регистрация: 04.07.2011
Сообщений: 3
04.07.2011, 19:42  [ТС] #3
Спасибо за ответ. Я хотел разделить описание в .h файл, реализацию в .cpp, когда перенес реализацию в .h файл все заработало.
Но тогда остается непонятным, как у стандартных библиотек, которые используют шаблоны калссов описание и реализация разделены и при этом все работает.
0
bigredcat
366 / 313 / 3
Регистрация: 24.02.2011
Сообщений: 1,512
Записей в блоге: 1
05.07.2011, 10:50 #4
Цитата Сообщение от Сергей_009 Посмотреть сообщение
Но тогда остается непонятным, как у стандартных библиотек, которые используют шаблоны калссов описание и реализация разделены и при этом все работает.
Покажите, где это так.
0
Сергей_009
0 / 0 / 0
Регистрация: 04.07.2011
Сообщений: 3
05.07.2011, 15:15  [ТС] #5
Я изучал C++ в прошлом веке еще тогда хоть шаблоны уже были, но о стандартных библиотеках использующих шаблоны я что-то не слышал. Сейчас посмотрел файлы с расширением .h на примере для библиотеки vector, там действительно не только описание, но и реализация в их подключаемых библиотеках, а я думал, что для них также описание в .h файле, а реализация отдельно в библиотеке.
Так что я сам ошибся.
0
aiwprton805
70 / 70 / 26
Регистрация: 30.03.2013
Сообщений: 189
Завершенные тесты: 1
08.01.2016, 13:02 #6
Кто-нибудь знает, в Visual Studio 2015 такое разделение работает? Или всё равно надо реализацию в .h пихать?
0
08.01.2016, 13:02
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.01.2016, 13:02
Привет! Вот еще темы с ответами:

Раздельная компиляция файлов - C++
Если класс определен в раздельных файлах и изменения сделаны в части main программы, кот использует класс - какой файл необходимо...

Создание классов в С++. Раздельная компиляция - C++
При создании класса C++ в VS создается два файла, &quot;&lt;имя_класса&gt;.h&quot; и &quot;&lt;имя_класса&gt;.cpp&quot;, зачем они ? В каком сам класс писать? Простите за...

Раздельная компиляция шаблонов классов - C++
При разделении шаблона класса на .h и .cpp линковщик ругается. Неужели в C++17 ещё не пофиксили это недоразумение и придётся писать всё в...

Раздельная компиляция ( Code blocks) - C++
версия 16.01 при вызове функции из другого файла, стал писать, что я не указал прототип функции и &quot;ld returned 1 exit status&quot;. хотя делал...


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

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

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