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

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

Войти
Регистрация
Восстановить пароль
 
D.E.S.P.E.R.O.
9 / 9 / 0
Регистрация: 12.03.2009
Сообщений: 110
Завершенные тесты: 1
#1

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

29.10.2012, 16:43. Просмотров 826. Ответов 11
Метки нет (Все метки)

Столкнулся со следующей проблемой. Приведенный ниже шаблон класса коректно компилируется и работает пока находится в одном срр-шном файле вместе с функцией 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++
Есть у меня 3 структуры Трамвай , Троллейбус , Автобус. Для автобуса определены функции (работают) Троллейбус и Трамвай одинаковые поля...

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

Шаблон класса (параметризация класса) - C++
Нужна помощь и советы!!! Англо-русский словарь построен как список. Каждая компонента содержит английское слово, соответствующее...

Создать шаблон некоторого класса, возможно, реализованного с применением некоторого серверного класса - C++
Добрый день, Уважаемые профессионалы. Прошу помочь в решении задачи. Честно говоря, я ничего не понимаю. И вот...решил...

Шаблон класса - C++
Приветствую. Есть задание: 1. Создать шаблон заданного класса. Определить перегруженную операцию присваивания (“=”) и операции, заданные...

Шаблон класса - C++
Здравствуйте. Допустим есть шаблон класса: template &lt;typename T&gt; class M { M&lt;T&gt; operator* (const M &amp;m); //M operator*...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
29.10.2012, 16:48 #2
D.E.S.P.E.R.O., реализация шаблонов должна быть в одном файле с объявлением.
BRcr
4008 / 2297 / 155
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
29.10.2012, 16:48 #3
Цитата Сообщение от D.E.S.P.E.R.O. Посмотреть сообщение
Как только помещаю объявление и реализацию в отдельный заголовочный и срр-шный файли
Объявление и определение шаблонного класса и его методов должны находиться в одном модуле, читай - в одном и том же текстовом файле. Их нельзя разносить по двум файлам - .h и .cpp.
Такое вот ограничение, никуда не денешься.
DiffEreD
1430 / 767 / 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.
9 / 9 / 0
Регистрация: 12.03.2009
Сообщений: 110
Завершенные тесты: 1
29.10.2012, 16:51  [ТС] #6
Большое спасибо! Только начинаю серьезно работать с шаблонами и Вы сэкономили мне кучу нервных клеток!
ISergey
Maniac
Эксперт С++
1373 / 884 / 52
Регистрация: 02.01.2009
Сообщений: 2,653
Записей в блоге: 1
29.10.2012, 17:01 #7
Цитата Сообщение от BRcr Посмотреть сообщение
Их нельзя разносить по двум файлам - .h и .cpp.
Такое вот ограничение, никуда не денешься.
Разнести можно если специализировать шаблон..
John Prick
777 / 710 / 131
Регистрация: 27.07.2012
Сообщений: 2,041
Завершенные тесты: 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.
9 / 9 / 0
Регистрация: 12.03.2009
Сообщений: 110
Завершенные тесты: 1
29.10.2012, 17:12  [ТС] #9
Разделение не принципиально. Просто делал все как и в случае с обычными классами и не мог понять почему не работает...
soon
2540 / 1305 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
29.10.2012, 17:24 #10
Просто делал все как и в случае с обычными классами и не мог понять почему не работает...
Шаблоны инстанцируются во время компиляции.
D.E.S.P.E.R.O.
9 / 9 / 0
Регистрация: 12.03.2009
Сообщений: 110
Завершенные тесты: 1
29.10.2012, 17:29  [ТС] #11
Спасибо, soon. Если не ошибаюсь, недавно Вы уже просвещали меня по этой теме!

Добавлено через 54 секунды
И я все продолжаю копать в этом направленни...
BRcr
4008 / 2297 / 155
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
29.10.2012, 17:30 #12
Цитата Сообщение от ISergey Посмотреть сообщение
Разнести можно если специализировать шаблон..
Ну, да. Только это будет не совсем чтобы шаблон, смысл уже будет ближе к перегрузке.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.10.2012, 17:30
Привет! Вот еще темы с ответами:

шаблон класса - C++
компилятор с линковщиком выдают такие ошибки 1&gt;main.obj : error LNK2019: ссылка на неразрешенный внешний символ &quot;public: __thiscall...

Шаблон класса. - C++
Приведите пожалуйста пример какого нибудь простого класса с меню. Чтобы пользователь сам вводил, а не компьютер заполнял.

Шаблон класса - C++
//файл T_Point_template.h //--------------------------------------------------------------------------- #ifndef T_Point_templateH ...

Шаблон класса - C++
Привет товарищи. Тут в общем такая история, запилил шаблонный класс реализующий очередь , который работает на чарах, а вот на целочисленных...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
29.10.2012, 17:30
Ответ Создать тему
Опции темы

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