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

Undefined reference при работе с шаблонным класом

22.06.2017, 17:05. Показов 2099. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток!
Собственно, проблема такая:
Работаю в Code::Blocks, создаю экземпляр класса шаблонного (любого), и билдер всё время вываливает в ошибку undefined reference, ругаясь в первую очередь на вызов конструктора в main'е и на дальнейшие вызовы функций экземпляра.
Переделывал код всеми возможными способами и методами, делал "как по учебнику", всё равно эта ошибка.
Ниже текст 3 файлов программы и листинг ошибок:
Кликните здесь для просмотра всего текста

файл lab2.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
27
28
29
30
#ifndef LAB2_H
#define LAB2_H
 
template <class T>
class lab2
{
public:
    lab2();
    lab2(int);
    lab2(const lab2&);
    ~lab2(){dec();};
 
public:
    void print();
    void input(T, int);
    T get(int);
    T func1();
    T func2();
    int get_len(){return len;};
    void inc(){++counter();};
    void dec(){--counter();};
    static int copies(){return counter();};
private:
    T* arr;
    int len;
    static int& counter(){static int c=0; return c;};
 
 
};
#endif // LAB2_H

Кликните здесь для просмотра всего текста

файл lab2.cpp
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#include "lab2.h"
#include <iostream>
 
using namespace std;
 
template<class T>
lab2<T>::lab2()
{
    len=10;
    arr=new T[len]{0};
    inc();
}
 
 
template <class T>
lab2<T>::lab2(int si)
{
    if (si>0)
    {
        len=si;
    }
    else
    {
        len=10;
    }
    arr=new T[len]{0};
    inc();
}
 
template<class T>
lab2<T>::lab2(const lab2& obj)
{
    len=obj.len;
    arr=new T[len];
    for(int i=0;i,len;i++)
    {
        arr[i]=obj.arr[i];
    }
    inc();
}
 
template <class T>
void lab2<T>::print()
{
    cout<<"Списко элементов массива (индекс -> значение)\n";
    for(int i=0; i<len; i++)
    {
        cout<<i<<" -> " <<arr[i]<<"\n";
    }
}
 
 
template<class T>
void lab2<T>::input(T ell, int ind)
{
    if(ind<len&&ind>=0)
    {
        arr[ind]=ell;
    }
}
 
template <class T>
T lab2<T>::get(int ind)
{
    if(ind<0&&ind>=0)
    {
        return arr[ind];
    }
}
 
template<class T>
T lab2<T>::func1()
{
    T summ=0;
    for (int i=0;i<get_len();i+=2)
    {
        summ+=get(i);
    }
    return summ;
}
 
template<class T>
T lab2<T>::func2()
{
    T summ=0;
    int ind1=-1;
    int ind2=-1;
    for(int i=0;i<get_len();i++)
    {
        if (get(i)<0)
        {
            if(ind1==-1)
            {
                ind1=i;
            }
            else
            {
                if(ind2==-1)
                {
                    ind2=i;
                }
                else
                {
                    break;
                }
            }
        }
    }
    if(ind1!=-1&&ind2!=-1)
    {
        ind1++;
        for(int i=ind1;i<ind2;i++)
        {
            summ+=get(i);
        }
    }
 
    return summ;
}

Кликните здесь для просмотра всего текста

файл "main.cpp"
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
29
30
31
32
33
#include "lab2.h"
#include <iostream>
#include <time.h>
#include <stdlib.h>
 
 
 
 
using namespace std;
 
 
int main()
{
    setlocale(LC_ALL,"Rus");
 
    cout<<"Лабораторная работа 2\n";
    cout<<"Создание и заполение массива случайными числами\n";
    cout<<"Тип данных INT\nРазмер 20 элементов\n";
    int len=20;
    srand (time(NULL));
    lab2 <int> obj(len);
 
    for (int i=0;i<obj.get_len();i++)
    {
        obj.input((int)(rand() % 2001 + (-1000)),i);
    }
 
    obj.print();
    cout<<"Сумма элементов масива с нечётными номерами: "<<""<<"\n";
 
 
    return 0;
}

Кликните здесь для просмотра всего текста

Ошибки:

||=== Build: Debug in lab2 (compiler: GNU GCC Compiler) ===|
obj\Debug\main.o||In function `main':|
G:\cpp\lab2\main.cpp|21|undefined reference to `lab2<int>::lab2(int)'|
G:\cpp\lab2\main.cpp|25|undefined reference to `lab2<int>::input(int, int)'|
G:\cpp\lab2\main.cpp|28|undefined reference to `lab2<int>:rint()'|
||error: ld returned 1 exit status|
||=== Build failed: 4 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|


-------------- Build: Debug in lab2 (compiler: GNU GCC Compiler)---------------

mingw32-g++.exe -Wall -g -c G:\cpp\lab2\main.cpp -o obj\Debug\main.o
mingw32-g++.exe -o bin\Debug\lab2.exe obj\Debug\lab2.o obj\Debug\main.o
obj\Debug\main.o: In function `main':
G:/cpp/lab2/main.cpp:21: undefined reference to `lab2<int>::lab2(int)'
G:/cpp/lab2/main.cpp:25: undefined reference to `lab2<int>::input(int, int)'
G:/cpp/lab2/main.cpp:28: undefined reference to `lab2<int>:rint()'
collect2.exe: error: ld returned 1 exit status
Process terminated with status 1 (0 minute(s), 0 second(s))
4 error(s), 0 warning(s) (0 minute(s), 0 second(s))




Я уже не понимаю, что не так с вызовом? Всё как в учебнике, почему эта долбаная ошибка? При чем без разницы, какой конструктор вызывать или в какой памяти размещать экземпляр, одна и та же ошибка.
Эксперты, посмотрите опытным взором, скажите мне, где я упоролся?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.06.2017, 17:05
Ответы с готовыми решениями:

Undefined reference при работе с статическим полем класса
Здравствуйте. Вот пример: class A { public: A(); A(const A&amp;); ~A();

Ошибка при работе с Orfeo ToolBox: undefined reference to `TIFFReadRGBAStrip@
undefined reference to `TIFFReadRGBAStrip@LIBTIFF_4.0'.............libossim.so.1 на всех форумах советуют установить библиотеки...

Не собирается проект с шаблонным классом: "undefined reference"
Подскажите пожалуйста, не собирается проект. Пишет &quot;undefined reference to Unit::Set()&quot; и такое же про Unit::Get(); Unit.h #ifndef...

9
с++
1282 / 523 / 225
Регистрация: 15.07.2015
Сообщений: 2,562
22.06.2017, 17:07
Undefined reference-Неопределенные ссылки
0
0 / 0 / 0
Регистрация: 22.06.2017
Сообщений: 6
22.06.2017, 17:10  [ТС]
Как ни странно, но http://ideone.com/pnFAq6 вполне скомпилировал это, без ошибок. Проблема в IDE? Кто нибудь знает, как это чудо настроить?
0
с++
1282 / 523 / 225
Регистрация: 15.07.2015
Сообщений: 2,562
22.06.2017, 17:12
Цитата Сообщение от Alexey9876 Посмотреть сообщение
Как ни странно
так там все в одном файле а если прототипы в одном файле а реализация в другом то выйдет эта ошибка все это иза шаблонов
0
0 / 0 / 0
Регистрация: 22.06.2017
Сообщений: 6
22.06.2017, 17:14  [ТС]
Я переводить умею, я не понимаю, что там не определенного? Всё чётко по учебнику, http://ideone.com/pnFAq6 спокойно проглотил, но Code::Blocks тупит с любым шаблоном. Мне эта IDE, в данный момент, весьма удобна, так что хотелось бы понять, как эту ошибку убрать.

Добавлено через 1 минуту
Эм, а какая разница, если файлы подключаются к главному? или шаблоны нельзя определять и описывать в разных файлах?
0
с++
1282 / 523 / 225
Регистрация: 15.07.2015
Сообщений: 2,562
22.06.2017, 17:21
Лучший ответ Сообщение было отмечено Alexey9876 как решение

Решение

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

Добавлено через 2 минуты
когда то была сделана функция export ну она не во всех компиляторах была реализованна
1
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
22.06.2017, 17:21
Цитата Сообщение от Antikl Посмотреть сообщение
когда то была сделана функция export ну она не во всех компиляторах была реализованна
А точнее только в одном, да и то её потом признали ненужной.
0
0 / 0 / 0
Регистрация: 22.06.2017
Сообщений: 6
22.06.2017, 17:22  [ТС]
Спасибо!
Многодневные мучения позади!
И ведь не пишут о подобной информации нигде...
0
с++
1282 / 523 / 225
Регистрация: 15.07.2015
Сообщений: 2,562
22.06.2017, 17:30
Цитата Сообщение от Alexey9876 Посмотреть сообщение
И ведь не пишут о подобной информации нигде...
в книге "Язык программирования C++. Лекции и упражнения" Стивен Прата было описано
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
22.06.2017, 18:43
Цитата Сообщение от Alexey9876 Посмотреть сообщение
И ведь не пишут о подобной информации нигде...
1.
пишут во всех книжках по шаблонам.

2.
и на одном только этом форуме вы - 100500,
кто задаёт подобный вопрос.
и вас таких - по 7мь штук на неделе.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.06.2017, 18:43
Помогаю со студенческими работами здесь

Undefined reference при работе X11 функций
Возможно я немного ошибся разделом, но ничего лучше я не знаю. Я пытался скомпилировать пример на С с использованием OpenGL но возникла...

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

Undefined reference при линковке
Здравствуйте, делал реализацию очереди на плюсах. Создал отдельный хедер и исходник для очереди. Пытался через make собрать, но на линковке...

Undefined reference при подключении curl
Пытаюсь подключить данную библиотеку к проекту c++ Использую GCC и G++ на ElementaryOS (дистрибутив убунту) Библиотека подключена через...

Undefined reference при создании объекта
Есть класс Engine и функция для его инициализации - CreateEngine при попытке создать объект с помощью Engine *engine =...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK сделайте это, JDK, то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Перейдите по ссылке:. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru