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

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

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

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

16.07.2014, 21:46. Просмотров 926. Ответов 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++
Пересмотрел что видел на форуме, но что то всеравно криво получается, буду благодарен если поможете Задание для начала достаточно...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
gromo
370 / 269 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
16.07.2014, 21:53 #2
QGuest, классу String известно про класс ArrayList?
0
QGuest
8 / 8 / 0
Регистрация: 08.01.2013
Сообщений: 85
16.07.2014, 21:55  [ТС] #3
Цитата Сообщение от gromo Посмотреть сообщение
классу String известно про класс ArrayList?
Да, забыл добавить сверху
C++
1
template<typename T> class ArrayList;
0
olper
24 / 24 / 11
Регистрация: 02.12.2013
Сообщений: 75
16.07.2014, 21:57 #4

Не по теме:

основная ошибка:

Цитата Сообщение от QGuest Посмотреть сообщение
#include "ArrayList.cpp"



А вообще надо "представить" всю единицу трансляции, а не гадать по кусочку с реализацией
0
gromo
370 / 269 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
16.07.2014, 21:58 #5
Цитата Сообщение от QGuest Посмотреть сообщение
Да, забыл добавить в начале
C++
1
template<typename T> class ArrayList;
так нельзя, насколько мне известно. Только в С++11 можно делать extern template<typename T> class ArrayList;
А до этого надо было включать объявление шаблона полностью и во все единицы трансляции где он используется.
Попробуйте добавить:
C++
1
extern template<typename T> class ArrayList;
Если не поможет, то пересоберите проект полностью. Если и это не поможет, то без дополнительного кода мои телепатические возомжности дают сбой.
0
QGuest
8 / 8 / 0
Регистрация: 08.01.2013
Сообщений: 85
16.07.2014, 21:59  [ТС] #6
Цитата Сообщение от olper Посмотреть сообщение
Надо видеть всю единицу трансляции, а не только реализацию
Это как? Что за единица трансляции?
0
olper
24 / 24 / 11
Регистрация: 02.12.2013
Сообщений: 75
16.07.2014, 22:00 #7
QGuest, все инклуды в обоих файлах... как минимум
0
QGuest
8 / 8 / 0
Регистрация: 08.01.2013
Сообщений: 85
16.07.2014, 22:04  [ТС] #8
Цитата Сообщение от gromo Посмотреть сообщение
Только в С++11 можно делать extern template<typename T> class ArrayList;
Добавил. Теперь появились 43 ошибки. По-моему, что-то не так)

Добавлено через 1 минуту
Цитата Сообщение от olper Посмотреть сообщение
все инклуды в обоих файлах
Файл один: Utils.h.
И два String.cpp и ArrayList.cpp инклудят его.
0
olper
24 / 24 / 11
Регистрация: 02.12.2013
Сообщений: 75
16.07.2014, 22:06 #9
QGuest, и iclude guards-ы
0
QGuest
8 / 8 / 0
Регистрация: 08.01.2013
Сообщений: 85
16.07.2014, 22:09  [ТС] #10
Цитата Сообщение от olper Посмотреть сообщение
и iclude guards-ы
в каждом файле стоит #pragma once
0
gromo
370 / 269 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
16.07.2014, 22:11 #11
Цитата Сообщение от QGuest Посмотреть сообщение
Добавил. Теперь появились 43 ошибки. По-моему, что-то не так)
Я перепутал немного:
C++
1
extern template ArrayList<String>;
Хотя у вас проблема скорее всего в другом
0
QGuest
8 / 8 / 0
Регистрация: 08.01.2013
Сообщений: 85
16.07.2014, 22:13  [ТС] #12
Цитата Сообщение от gromo Посмотреть сообщение
Я перепутал немного:
extern template ArrayList<String>;
Нет, к сожалению не помогло.
0
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
16.07.2014, 22:59 #13
Цитата Сообщение от QGuest Посмотреть сообщение
C++
1
#include "ArrayList.cpp"
Никогда так не делайте. Включать надо или заголовочные файлы, или файлы с шаблонным кодом. Т.е. давать им соответствующее (говорящее) расширение. Например *.hpp, *.tcc.
По теме: приведите минимальный пример, в котором проявляется ошибка.
0
QGuest
8 / 8 / 0
Регистрация: 08.01.2013
Сообщений: 85
16.07.2014, 23:04  [ТС] #14
Цитата Сообщение от Tulosba Посмотреть сообщение
приведите минимальный пример, в котором проявляется ошибка.
А какой пример? Я просто пытаюсь скомпилировать весь код. main пустой.
0
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
16.07.2014, 23:08 #15
Цитата Сообщение от QGuest Посмотреть сообщение
А какой пример?
Минимальный. Т.е. убрать лишние строки, которые не влияют на результат.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.07.2014, 23:08
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
16.07.2014, 23:08
Ответ Создать тему
Опции темы

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