Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
8 / 8 / 0
Регистрация: 08.01.2013
Сообщений: 85

Ошибки линковки при использовании шаблонного класса

16.07.2014, 21:46. Показов 3601. Ответов 27
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть заголовочной файл Utils.h, в котором определены 2 класса String и ArrayList<T>:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class String : public Comparable<String> {
private:
    friend class Object;
    string data;
public:
    String() {}
    /**/
    ArrayList<String>* split(const String delimiter) const;
    /**/
};
 
template<typename T>
class ArrayList : public Object {
private:
    vector<T>* data = new vector<T>();
 
public:
    ArrayList();
    /**/
    ~ArrayList();
}; 
 
#include "ArrayList.cpp"
При компиляции сообщаются такие ошибки:
error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall ArrayList<class String>::ArrayList<class String>(void)" (??0?$ArrayList@VString@@@@QAE@XZ) в функции "public: class ArrayList<class String> * __thiscall String::split(class String)const " (?split@String@@QBEPAV?$ArrayList@VStrin g@@@@V1@@Z)
Проблема в функции "ArrayList<String>* split(const String delimiter)". Вот ее реализация:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
ArrayList<String>* String::split(const String delimiter) const {
    ArrayList<String>* parts = new ArrayList<String>();
 
    if (delimiter != "") {
        string::size_type lastPos = data.find_first_not_of(delimiter.data, 0);
        string::size_type pos = data.find_first_of(delimiter.data, lastPos);
        while (string::npos != pos || string::npos != lastPos) {
            parts->add(data.substr(lastPos, pos - lastPos));
            lastPos = data.find_first_not_of(delimiter.data, pos);
            pos = data.find_first_of(delimiter.data, lastPos);
        }
    }
    else {
        parts->add(*this);
    }
 
    return parts;
}
Как, собственно, исправить эту ошибку?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.07.2014, 21:46
Ответы с готовыми решениями:

Неопределенная ссылка при использовании шаблонного класса
в проекте 4 файла: CmakeLists.txt, main.cpp, list.h, list.cpp. CmakeLists.txt: cmake_minimum_required(VERSION 2.8) ...

Как корректно передать в метод шаблонного класса объект шаблонного класса в качестве параметра?
header.h template &lt;class T&gt; class MyVector { public: void swap(MyVector&lt;T&gt;Vector); } template &lt;class T&gt; void...

Ошибки линковки при работе с DirectX
Создал DirectX проект, и решил разбить на файлы, создал render.cpp и main.cpp, они отвечают за разные функции, но стоит подключить к...

27
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
17.07.2014, 21:43
Лучший ответ Сообщение было отмечено QGuest как решение

Решение

Студворк — интернет-сервис помощи студентам
TestApp.zip
Потому что вообще не разбираюсь в C++. Я с Java начинал.
это не повод везде совать new
1
8 / 8 / 0
Регистрация: 08.01.2013
Сообщений: 85
17.07.2014, 21:48  [ТС]
Цитата Сообщение от Jupiter Посмотреть сообщение
это не повод везде совать new
Ну а как тогда эти объекты удалять? При delete [object] программа будет ошибкой вылетать.
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
17.07.2014, 22:00
Цитата Сообщение от QGuest Посмотреть сообщение
Ну а как тогда эти объекты удалять?
выходом из области видимости
0
 Аватар для gromo
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
17.07.2014, 22:02
Цитата Сообщение от QGuest Посмотреть сообщение
Ну а как тогда эти объекты удалять?
еще почитайте про std::unique_ptr и std::shared_ptr
При использовании этих указателей программирование на С++ превращается в джаву
1
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
18.07.2014, 20:26
Цитата Сообщение от QGuest Посмотреть сообщение
Ну а как тогда эти объекты удалять? При delete [object] программа будет ошибкой вылетать.
А такие объекты не надо удалять. Они сами "удаляются" в конце области видимости.
В С++ есть несколько классов хранения. Динамически выделенная память - это только один из них.
Ну вот хотя бы тут можно почитать.
У С++ своя идеология, похожесть синтаксиса обманчиво роднит с Java, но это иллюзия. В глобальном смысле подходы к разработке софта совсем разные.
1
8 / 8 / 0
Регистрация: 08.01.2013
Сообщений: 85
18.07.2014, 21:06  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Они сами "удаляются" в конце области видимости
То есть, даже если объект создать используя new и никуда его не передавать, то он все равно удалится?
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
18.07.2014, 21:25
Цитата Сообщение от QGuest Посмотреть сообщение
То есть, даже если объект создать используя new и никуда его не передавать, то он все равно удалится?
Нет.
В конце области видимости удаляются только автоматические переменные (automatic storage duration).
Переменная, выделенная с помощью new - имеет динамический класс хранения (dynamic storage duration) и нуждается в delete для освобождения памяти.
По ссылке, которую я привел, это описано в общих чертах. В принципе этого достаточно, чтобы понять разницу.

Добавлено через 6 минут
QGuest,
Вот пример:

C++
1
2
3
4
5
6
7
8
9
10
11
void foo()
{
    int a = 1; // <- automatic storage duration, живет до конца области видимости
    static int b = 2; // <- static storage duration, живет до конца программы
    int * ptr = new int[20]; // ptr <- automatic, живет до конца области видимости
                             // а вот память, на которую указывает ptr (в данном случае массив из 20 int),
                             // имеет dynamic storage duration, 
                             // чтобы ее освободить нужно вызвать delete []
 
    delete[] ptr; 
}
3
8 / 8 / 0
Регистрация: 08.01.2013
Сообщений: 85
18.07.2014, 21:28  [ТС]
DrOffset, спасибо за подробное разъяснение.

Не по теме:

Плюсанул еще и другой комментарий :)

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.07.2014, 21:28

Вызов метода у шаблонного поля, шаблонного класса
Пытаюсь разобраться с шаблонами- задача создать шаблонный класс, у которого есть шаблонное поле. и затем вызывать метод у этого поля. ...

Исправить ошибки линковки при подключении библиотек Ilu
Здравствуйте подскажите как исправить, уже 2 день пытаюсь и ничего не получается. Подключил библиотеки в вижак, скинул либы в папку либ,...

Ошибки на этапе линковки, при работе с шаблонами (LNK2019)
В качестве учебной задачки начал реализовывать какое-то подобие вектора, но вот столкнулся с проблемой: ...

Ошибка при компиляции шаблонного класса С++
Всем привет. Не нашел на форуме раздел по с++, но т.к. пишу под stm32, написал здесь. Программу, код которой представлен ниже, не...

Ошибка при создании шаблонного класса
Всем привет!!!! пытаюсь реализовать паттерн итератор для двусвязного списка но до реализации пока не дошел потому что при компиляции код...


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

Или воспользуйтесь поиском по форуму:
28
Ответ Создать тему
Новые блоги и статьи
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы. Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru