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

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

Восстановить пароль Регистрация
 
 
QGuest
8 / 8 / 0
Регистрация: 08.01.2013
Сообщений: 85
16.07.2014, 21:46     Ошибки линковки при использовании шаблонного класса #1
Есть заголовочной файл 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@VString@@@@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;
}
Как, собственно, исправить эту ошибку?
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
17.07.2014, 21:43     Ошибки линковки при использовании шаблонного класса #21
Сообщение было отмечено автором темы, экспертом или модератором как ответ
TestApp.zip
Потому что вообще не разбираюсь в C++. Я с Java начинал.
это не повод везде совать new
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
QGuest
8 / 8 / 0
Регистрация: 08.01.2013
Сообщений: 85
17.07.2014, 21:48  [ТС]     Ошибки линковки при использовании шаблонного класса #22
Цитата Сообщение от Jupiter Посмотреть сообщение
это не повод везде совать new
Ну а как тогда эти объекты удалять? При delete [object] программа будет ошибкой вылетать.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
17.07.2014, 22:00     Ошибки линковки при использовании шаблонного класса #23
Цитата Сообщение от QGuest Посмотреть сообщение
Ну а как тогда эти объекты удалять?
выходом из области видимости
gromo
 Аватар для gromo
366 / 265 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
17.07.2014, 22:02     Ошибки линковки при использовании шаблонного класса #24
Цитата Сообщение от QGuest Посмотреть сообщение
Ну а как тогда эти объекты удалять?
еще почитайте про std::unique_ptr и std::shared_ptr
При использовании этих указателей программирование на С++ превращается в джаву
DrOffset
6461 / 3835 / 886
Регистрация: 30.01.2014
Сообщений: 6,630
18.07.2014, 20:26     Ошибки линковки при использовании шаблонного класса #25
Цитата Сообщение от QGuest Посмотреть сообщение
Ну а как тогда эти объекты удалять? При delete [object] программа будет ошибкой вылетать.
А такие объекты не надо удалять. Они сами "удаляются" в конце области видимости.
В С++ есть несколько классов хранения. Динамически выделенная память - это только один из них.
Ну вот хотя бы тут можно почитать.
У С++ своя идеология, похожесть синтаксиса обманчиво роднит с Java, но это иллюзия. В глобальном смысле подходы к разработке софта совсем разные.
QGuest
8 / 8 / 0
Регистрация: 08.01.2013
Сообщений: 85
18.07.2014, 21:06  [ТС]     Ошибки линковки при использовании шаблонного класса #26
Цитата Сообщение от DrOffset Посмотреть сообщение
Они сами "удаляются" в конце области видимости
То есть, даже если объект создать используя new и никуда его не передавать, то он все равно удалится?
DrOffset
6461 / 3835 / 886
Регистрация: 30.01.2014
Сообщений: 6,630
18.07.2014, 21:25     Ошибки линковки при использовании шаблонного класса #27
Цитата Сообщение от 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; 
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.07.2014, 21:28     Ошибки линковки при использовании шаблонного класса
Еще ссылки по теме:

Вызов метода у шаблонного поля, шаблонного класса C++
Ошибка при создании шаблонного класса C++
Ошибки при использовании встроенной функции C++

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

Или воспользуйтесь поиском по форуму:
QGuest
8 / 8 / 0
Регистрация: 08.01.2013
Сообщений: 85
18.07.2014, 21:28  [ТС]     Ошибки линковки при использовании шаблонного класса #28
DrOffset, спасибо за подробное разъяснение.

Не по теме:

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

Yandex
Объявления
18.07.2014, 21:28     Ошибки линковки при использовании шаблонного класса
Ответ Создать тему
Опции темы

Текущее время: 16:48. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru