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

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

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

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

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

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

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

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

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

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

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

Ошибки при использовании stringstream - C++
Текст программы: #include &lt;stdio.h&gt; #include &lt;iostream&gt; #include &lt;string.h&gt; using namespace std; int main()...

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

Не по теме:

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

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



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

Баг при использовании класса string при записи в бинарный файл - C++
При записи в бинарный файл пользовательского класса, всё отлично отрабатывает, но, если в классе использовался класс string, то в конце...

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

Ошибки линковщика при использовании сокетов - C++
Доброго времени суток! При попытки скомпилировать код, линковшик выдает ошибки. Хотелось бы узнать: Почему и как это убрать? Код: ...

Ошибки линковки - C++
Нужна помощь! Как исправить эти ошибки при компиляции! Все либы и заголовки дополнительные указаны он вроде их не требует! Я даже не...

ошибки линковки с++(... - C++
помогите пожалуйста!! справится с ошибками линковки масив.obj : error LNK2001: unresolved external symbol &quot;void __cdecl obr(int &amp;,int *)&quot;...


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

Или воспользуйтесь поиском по форуму:
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
16.07.2014, 23:08     Ошибки линковки при использовании шаблонного класса #15
Цитата Сообщение от QGuest Посмотреть сообщение
А какой пример?
Минимальный. Т.е. убрать лишние строки, которые не влияют на результат.
Yandex
Объявления
16.07.2014, 23:08     Ошибки линковки при использовании шаблонного класса
Ответ Создать тему
Опции темы

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