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

Шаблон класса - C++

Восстановить пароль Регистрация
 
D.E.S.P.E.R.O.
 Аватар для D.E.S.P.E.R.O.
9 / 9 / 0
Регистрация: 12.03.2009
Сообщений: 110
Завершенные тесты: 1
29.10.2012, 16:43     Шаблон класса #1
Столкнулся со следующей проблемой. Приведенный ниже шаблон класса коректно компилируется и работает пока находится в одном срр-шном файле вместе с функцией main:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include "main.h"
 
template<typename T>
class fake_vector
{
public:
    fake_vector();
    virtual ~fake_vector() { }
 
private:
    std::vector<T> container;
};
 
template<typename T>
fake_vector<T>::fake_vector()
{
    cout << "fake_vector() called with " << typeid(T).name() << " type!" << endl;
}
 
int main(int argc, char **argv)
{
    cout << *(argv + argc - 1) << endl;
 
    fake_vector<int> v;
 
    system("PAUSE");
    return 0;
}
Как только помещаю объявление и реализацию в отдельный заголовочный и срр-шный файли, то сразу же вылазит следующая ошибка линковщика:
Error 1 error LNK2019: unresolved external symbol "public: __thiscall fake_vector<int>::fake_vector<int>(void)" (??0?$fake_vector@H@@QAE@XZ) referenced in function _main main.obj
Подскажите, пожалуйста, что делаю не так... Заранее спасибо!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.10.2012, 16:43     Шаблон класса
Посмотрите здесь:

C++ Шаблон класса.
Шаблон класса (параметризация класса) C++
C++ Шаблон класса
C++ шаблон класса
C++ шаблон класса
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
29.10.2012, 16:48     Шаблон класса #2
D.E.S.P.E.R.O., реализация шаблонов должна быть в одном файле с объявлением.
BRcr
 Аватар для BRcr
4003 / 2292 / 155
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
29.10.2012, 16:48     Шаблон класса #3
Цитата Сообщение от D.E.S.P.E.R.O. Посмотреть сообщение
Как только помещаю объявление и реализацию в отдельный заголовочный и срр-шный файли
Объявление и определение шаблонного класса и его методов должны находиться в одном модуле, читай - в одном и том же текстовом файле. Их нельзя разносить по двум файлам - .h и .cpp.
Такое вот ограничение, никуда не денешься.
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
29.10.2012, 16:48     Шаблон класса #4
Это потому что шаблонные функции члены класса должны быть определены в том же файле что и класс.
BRcr
29.10.2012, 16:50
  #5

Не по теме:

Насколько замусолена эта тема с шаблонами - один и тот же ответ поступает со скоростью три человека в минуту.

D.E.S.P.E.R.O.
 Аватар для D.E.S.P.E.R.O.
9 / 9 / 0
Регистрация: 12.03.2009
Сообщений: 110
Завершенные тесты: 1
29.10.2012, 16:51  [ТС]     Шаблон класса #6
Большое спасибо! Только начинаю серьезно работать с шаблонами и Вы сэкономили мне кучу нервных клеток!
ISergey
Maniac
Эксперт С++
 Аватар для ISergey
1331 / 864 / 50
Регистрация: 02.01.2009
Сообщений: 2,622
Записей в блоге: 1
29.10.2012, 17:01     Шаблон класса #7
Цитата Сообщение от BRcr Посмотреть сообщение
Их нельзя разносить по двум файлам - .h и .cpp.
Такое вот ограничение, никуда не денешься.
Разнести можно если специализировать шаблон..
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
29.10.2012, 17:08     Шаблон класса #8
Ну можно разнести по разным .h файлам объявление и реализацию шаблонного класса, файл реализации подключить в конце файла объявления.

Добавлено через 4 минуты
В кратце, так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
// defenition.h
#ifndef DEFINITION_H
#define DEFINITION_H
 
template<class T>
class CClass
{
    void func();
};
 
#include "realization.h"
 
#endif
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
//realization.h
#ifdef DEFINITION_H
 
#ifndef REALIZATION_H
#define REALIZATION_H
 
template<class T>
void CClass<T>::func() {}
 
#endif // REALIZATION_H
#else // DEFINITION_H
#error "You must include definition.h"
#endif
D.E.S.P.E.R.O.
 Аватар для D.E.S.P.E.R.O.
9 / 9 / 0
Регистрация: 12.03.2009
Сообщений: 110
Завершенные тесты: 1
29.10.2012, 17:12  [ТС]     Шаблон класса #9
Разделение не принципиально. Просто делал все как и в случае с обычными классами и не мог понять почему не работает...
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
29.10.2012, 17:24     Шаблон класса #10
Просто делал все как и в случае с обычными классами и не мог понять почему не работает...
Шаблоны инстанцируются во время компиляции.
D.E.S.P.E.R.O.
 Аватар для D.E.S.P.E.R.O.
9 / 9 / 0
Регистрация: 12.03.2009
Сообщений: 110
Завершенные тесты: 1
29.10.2012, 17:29  [ТС]     Шаблон класса #11
Спасибо, soon. Если не ошибаюсь, недавно Вы уже просвещали меня по этой теме!

Добавлено через 54 секунды
И я все продолжаю копать в этом направленни...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.10.2012, 17:30     Шаблон класса
Еще ссылки по теме:

C++ Создать шаблон некоторого класса, возможно, реализованного с применением некоторого серверного класса
C++ Шаблон класса
Шаблон класса, параметром которого должны являться наследники определённого класса C++

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

Или воспользуйтесь поиском по форуму:
BRcr
 Аватар для BRcr
4003 / 2292 / 155
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
29.10.2012, 17:30     Шаблон класса #12
Цитата Сообщение от ISergey Посмотреть сообщение
Разнести можно если специализировать шаблон..
Ну, да. Только это будет не совсем чтобы шаблон, смысл уже будет ближе к перегрузке.
Yandex
Объявления
29.10.2012, 17:30     Шаблон класса
Ответ Создать тему
Опции темы

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