Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/40: Рейтинг темы: голосов - 40, средняя оценка - 4.80
3 / 3 / 0
Регистрация: 20.01.2014
Сообщений: 69

Как расположить шаблонный класс в разных файлах?

04.03.2014, 14:53. Показов 7642. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть некоторый класс A, он размещен в разных файлах так:

main.cpp :
C++
1
2
3
4
5
#include <iostream>
#include "a.h"
int main() {
    A a;
}
a.h :
C++
1
2
3
4
5
6
7
8
#ifndef A_H
#define A_H
class A {
public:
    A();
    ~A();
};
#endif
a.cpp :
C++
1
2
3
4
5
#include "a.h"
A::A(){
}
A::~A(){
}
Я пытаюсь сделать его шаблонным так:
main.cpp :
C++
1
2
3
4
5
#include <iostream>
#include "a.h"
int main() {
    A<int> a;
}
a.h :
C++
1
2
3
4
5
6
7
8
9
#ifndef A_H
#define A_H
template <class T>
class A {
public:
    A();
    ~A();
};
#endif
a.cpp :
C++
1
2
3
4
5
6
7
#include "a.h"
template <class T>
A<T>::A(){
}
template <class T>
A<T>::~A(){
}
В таком случае непонятно почему выдает ошибки:
Bash
1
2
3
1>Компоновка...
1>main.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall A<int>::~A<int>(void)" (??1?$A@H@@QAE@XZ) в функции _main
1>main.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall A<int>::A<int>(void)" (??0?$A@H@@QAE@XZ) в функции _main
Причем если определить весь шаблонный класс(определение+методы) и функцию main в одном файле, то ошибок не возникает:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
template <class T>
class A {
public:
    A();
    ~A();
};
 
template <class T>
A<T>::A(){
}
template <class T>
A<T>::~A(){
}
 
int main() {
    A<int> a;
}
Почему так и как заставить работать шаблонный класс, разместив его в разных файлах(определение и методы отдельно) ?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.03.2014, 14:53
Ответы с готовыми решениями:

Не могу использовать класс в классе, определённые в разных файлах
Есть значит у меня два файла с классами в visual studio. Первый : #include &quot;Email.h&quot; #include &quot;Folder.h&quot; using...

Шаблонный класс "Окно" для вывода объектов разных классов
Всем привет! Нужно создать шаблонный класс ОКНО, и использовать его для вывода значений объектов классов МАССИВ СТРОК, МАССИВ ЦЕЛЫХ ЧИСЕЛ,...

Как передать значение в шаблонный класс
Здравствуйте. Помогите пожалуйста. Я хочу передать два заполненных вектора в класс, но у меня возникает ошибка. Не понимаю, что я делаю не...

4
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
04.03.2014, 14:54
Никак. Экспорт шаблонов пока не поддерживается.
1
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
04.03.2014, 14:59
CheshireCat, его вообще исключили из стандарта. Следовательно он и не будет поддерживаться.
BlackUser, одно из решений

Добавлено через 1 минуту
Цитата Сообщение от BlackUser Посмотреть сообщение
В таком случае непонятно почему выдает ошибки:
Объяснение.
1
3 / 3 / 0
Регистрация: 20.01.2014
Сообщений: 69
04.03.2014, 15:12  [ТС]
В указанном решении, как я понимаю файл .cpp с реализацией методов нужно исключить из компиляции, чтобы его содержимое просто подставлялось в .h файл во время компиляции?

То есть методы, которые будут вызваны составляются на этапе компиляции и компилятор не может заранее знать какие методы понадобятся?

Мне просто надо, чтобы код был в отдельных объектных файлах. То есть есть например 10 шаблонных классов, у каждого класса определение маленькое, а код для методов БОЛЬШОЙ и его долго компилировать. Как мне тогда быть, ведь в таком случае объектные файлы для каждого из классов создаваться заранее не будут, и придется абсолютно весь код компилировать заного при любом изменении main.cpp файла ?
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
04.03.2014, 15:29
Лучший ответ Сообщение было отмечено BlackUser как решение

Решение

Цитата Сообщение от BlackUser Посмотреть сообщение
В указанном решении, как я понимаю файл .cpp с реализацией методов нужно исключить из компиляции
Можно и cpp, но лучше все-таки hpp или что-то подобное.

Цитата Сообщение от BlackUser Посмотреть сообщение
То есть методы, которые будут вызваны составляются на этапе компиляции и компилятор не может заранее знать какие методы понадобятся?
Да подстановка аргументов (инстанцирование) шаблона инициирует этот процесс на этапе компиляции. Все сложности и ограничения возникают из принципа раздельной компиляции, который принят в С++: каждый cpp компилируется отдельно, без информации об остальных.

Цитата Сообщение от BlackUser Посмотреть сообщение
Мне просто надо, чтобы код был в отдельных объектных файлах. То есть есть например 10 шаблонных классов, у каждого класса определение маленькое, а код для методов БОЛЬШОЙ и его долго компилировать. Как мне тогда быть, ведь в таком случае объектные файлы для каждого из классов создаваться заранее не будут, и придется абсолютно весь код компилировать заного при любом изменении main.cpp файла ?
Есть полумера - precompiled headers - в студии например работает через stdafx.h. А вообще да, придется ждать пока все пересоберется.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.03.2014, 15:29
Помогаю со студенческими работами здесь

Как отсортировать данный шаблонный двусвязный класс?
Пишу программу &quot; Моя записная книжка&quot; Необходимо сделать сортировку по разным полям. Я не могу понять как это реализовать. Помогите...

Как корректно удалить шаблонный класс CList?
Создаю указатель на класс CList в заголовочном файле. С помощью этого указателя динамически создаю нужное количество (N) объектов класса...

Как правильно подключить шаблонный класс (VS2008)?
Добрый день! Помогите в подключении шаблонного класса в Visual Studio 2008 Professional. Создал консольный проект,в заголовочном...

Передать шаблонный класс, как параметр шаблона
нужно не используя stl написать аналог класса list. написал болванку и застрял template&lt;class C&gt; class node{ protected: C...

Tdbf, как найти дубли в разных файлах?
есть несколько таблиц .dbf все они одинаковой структуры как с помощью TDBF во всех таблицах найти одинаковые записи по полю Name и...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru