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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
QGuest
8 / 8 / 0
Регистрация: 08.01.2013
Сообщений: 85
#1

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

16.07.2014, 21:46. Просмотров 945. Ответов 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@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;
}
Как, собственно, исправить эту ошибку?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.07.2014, 21:46
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ошибки линковки при использовании шаблонного класса (C++):

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

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

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

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

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

При помощи шаблонного класса создать матрицу и вывести ее - C++
Пересмотрел что видел на форуме, но что то всеравно криво получается, буду благодарен если поможете Задание для начала достаточно...

27
QGuest
8 / 8 / 0
Регистрация: 08.01.2013
Сообщений: 85
17.07.2014, 17:25  [ТС] #16
Цитата Сообщение от Tulosba Посмотреть сообщение
Минимальный. Т.е. убрать лишние строки, которые не влияют на результат.
Вот мин. проект скачать

Добавлено через 17 часов 41 минуту
Tulosba, так вы подскажете как решить проблему?
0
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.07.2014, 21:25 #17
Цитата Сообщение от QGuest Посмотреть сообщение
Вот мин. проект
Здесь архив с проектом выложите.
0
QGuest
8 / 8 / 0
Регистрация: 08.01.2013
Сообщений: 85
17.07.2014, 21:31  [ТС] #18
Цитата Сообщение от alsav22 Посмотреть сообщение
Здесь архив с проектом выложите
Сори, просто не знал, что тут можно файлы выкладывать.
0
Вложения
Тип файла: rar TestApp.rar (1,016.7 Кб, 4 просмотров)
gromo
17.07.2014, 21:32
  #19

Не по теме:

так вы подскажете как решить проблему?
если вы пишете такой высокооктановый шаблонный код [class Object : public Objectable<<>>], то почему не можете отловить ошибку линковки?

0
QGuest
17.07.2014, 21:35  [ТС]
  #20

Не по теме:

Цитата Сообщение от gromo Посмотреть сообщение
если вы пишете такой высокооктановый шаблонный код, то почему не можете отловить ошибку линковки?
Потому что вообще не разбираюсь в C++. Я с Java начинал.

0
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
17.07.2014, 21:43 #21
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
TestApp.zip
Потому что вообще не разбираюсь в C++. Я с Java начинал.
это не повод везде совать new
1
QGuest
8 / 8 / 0
Регистрация: 08.01.2013
Сообщений: 85
17.07.2014, 21:48  [ТС] #22
Цитата Сообщение от Jupiter Посмотреть сообщение
это не повод везде совать new
Ну а как тогда эти объекты удалять? При delete [object] программа будет ошибкой вылетать.
0
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
17.07.2014, 22:00 #23
Цитата Сообщение от QGuest Посмотреть сообщение
Ну а как тогда эти объекты удалять?
выходом из области видимости
0
gromo
371 / 270 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
17.07.2014, 22:02 #24
Цитата Сообщение от QGuest Посмотреть сообщение
Ну а как тогда эти объекты удалять?
еще почитайте про std::unique_ptr и std::shared_ptr
При использовании этих указателей программирование на С++ превращается в джаву
1
DrOffset
7351 / 4451 / 1009
Регистрация: 30.01.2014
Сообщений: 7,292
18.07.2014, 20:26 #25
Цитата Сообщение от QGuest Посмотреть сообщение
Ну а как тогда эти объекты удалять? При delete [object] программа будет ошибкой вылетать.
А такие объекты не надо удалять. Они сами "удаляются" в конце области видимости.
В С++ есть несколько классов хранения. Динамически выделенная память - это только один из них.
Ну вот хотя бы тут можно почитать.
У С++ своя идеология, похожесть синтаксиса обманчиво роднит с Java, но это иллюзия. В глобальном смысле подходы к разработке софта совсем разные.
1
QGuest
8 / 8 / 0
Регистрация: 08.01.2013
Сообщений: 85
18.07.2014, 21:06  [ТС] #26
Цитата Сообщение от DrOffset Посмотреть сообщение
Они сами "удаляются" в конце области видимости
То есть, даже если объект создать используя new и никуда его не передавать, то он все равно удалится?
0
DrOffset
7351 / 4451 / 1009
Регистрация: 30.01.2014
Сообщений: 7,292
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; 
}
2
QGuest
8 / 8 / 0
Регистрация: 08.01.2013
Сообщений: 85
18.07.2014, 21:28  [ТС] #28
DrOffset, спасибо за подробное разъяснение.

Не по теме:

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

0
18.07.2014, 21:28
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.07.2014, 21:28
Привет! Вот еще темы с ответами:

Неявный вызов конструктора шаблонного класса при операции сравнения - C++
Реализовал шаблонный класс целых чисел, для использования его в шаблонном классе дробей. Звучит жутковасто. :D Так вот, в классе целых...

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

Возможно ли создание объекта шаблонного класса в функции этого класса? - C++
Доброго времени суток, уважаемые форумчане :) Мне по лабам задали задание - реализовать шаблон контейнера (множество) с операциями...

Ошибки при использовании конструкции if-else. - C++
Всех с наступающим! Ребята, подскажите в чем ошибка?


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

Или воспользуйтесь поиском по форуму:
28
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru