С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
2 / 2 / 0
Регистрация: 19.11.2016
Сообщений: 28
1

Ошибка Undefined Reference, связанная с использованием шаблона

18.10.2017, 15:08. Показов 1685. Ответов 3

Author24 — интернет-сервис помощи студентам
Здравствуйте! У меня появилась проблема. Есть три файла: main.cpp, a.h, a.cpp. В а.h объявлен шаблон класса А и обычный класс B, в a.cpp реализованы оба (вроде всё должно быть в порядке). В main.cpp подключён заголовочный файл a.h, также там есть попытка использовать шаблонный класс из a.h. Компилятор выдаёт ошибку "undefined reference". При этом использовать класс B можно без проблем. В чём прикол?
Вот код:
main.cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include "a.h"
 
using namespace std;
 
int main() {
    //A<int> a(12); - Ошибка
    B b(12); // Работает
    b.print();
    return 0;
}
a.h:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#ifndef A_H
#define A_H
 
template<typename T> class A {
public:
    A(T value);
 
    void print() const;
private:
    T value;
};
 
class B{
public:
    B(int value);
 
    void print() const;
private:
    int value;
};
 
#endif // A_H
a.cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include "a.h"
 
template<typename T> A<T>::A(T value): value(value) {
    std::cout << "Created the A, value is " << value << std::endl;
}
template<typename T> void A<T>::print() const {
    std::cout << "Printing the A, value is " << value << std::endl;
}
 
B::B(int value): value(value) {
    std::cout << "Created the B, value is " << value << std::endl;
}
void B::print() const {
    std::cout << "Printing the B, value is " << value << std::endl;
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.10.2017, 15:08
Ответы с готовыми решениями:

Странная ошибка: [Linker error] undefined reference to `__dyn_tls_init_callback' [Linker error] undefined reference to ld returned 1 exit status
Здравствуйте. Вот недавно начал изучать книгу &quot;С++ для чайников&quot; Стефан Р. Девис 4-е издание. И...

Ошибка undefined reference to
Пишу регистрацию класса окна. Для установки фона произвольного цвета фона использую...

Ошибка undefined reference
Имеется программа. Представляет из себя поисковую систему. Пишу в dev-cpp. При компиляции вылезает...

ошибка undefined reference to
Всем привет! подскажите, пожалуйста, почему выскакивает ошибка: undefined reference to...

3
Модератор
Эксперт С++
13721 / 10918 / 6478
Регистрация: 18.12.2011
Сообщений: 29,147
18.10.2017, 15:21 2
Шаблоны нельзя компилировать отдельно.
Пишите:
C++
1
#include "a.cpp"
1
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
18.10.2017, 15:44 3
Лучший ответ Сообщение было отмечено NovikovDen как решение

Решение

NovikovDen, потому что шаблоны нельзя отделять в другие единицы трансляции. Проще всего разместить все шаблоны в заголовочный файл, где они определены. Несколько сложнее - отключить компиляцию a.cpp (чтоб компилятор не пытался его скомпилировать отдельно), убрать из a.cpp
C++
1
#include "a.h"
и добавить #include "a.cpp" в a.h примерно так:

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
#ifndef A_H
#define A_H
 
template<typename T> class A {
public:
    A(T value);
 
    void print() const;
private:
    T value;
};
 
 
#include "a.cpp"
 
 
class B{
public:
    B(int value);
 
    void print() const;
private:
    int value;
};
 
#endif // A_H

Но как уже понятно, результат будет мало отличаться от прямого написания кода в заголовочном файле.
2
2 / 2 / 0
Регистрация: 19.11.2016
Сообщений: 28
18.10.2017, 16:04  [ТС] 4
Спасибо!
0
18.10.2017, 16:04
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.10.2017, 16:04
Помогаю со студенческими работами здесь

Ошибка undefined reference to
При сборке выбивает ошибку: undefined reference to `Atom:: DoBCC(float, int, int, int)'. Ткните...

Ошибка undefined reference to
main.cpp #include &lt;locale&gt; #include &lt;iostream&gt; #include &lt;Windows.h&gt; #include &quot;Class.h&quot; using...

Ошибка undefined reference to
Здравствуйте,столкнулся с проблемкой,никак не получается ее решить. Вот код: main: #include...

ошибка undefined reference to `_imp___ZN2sf5Image12loadFromFileERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE'|
Привет! Такая проблема: подключил sfml к codeblocks и скопировал тестовый код, все работает. но...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru