Форум программистов, компьютерный форум 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)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gromo
 Аватар для gromo
366 / 265 / 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
 Аватар для gromo
366 / 265 / 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
 Аватар для gromo
366 / 265 / 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
:)
Эксперт C++
4377 / 3220 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
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 пустой.
Tulosba
:)
Эксперт C++
4377 / 3220 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
16.07.2014, 23:08     Ошибки линковки при использовании шаблонного класса #15
Цитата Сообщение от QGuest Посмотреть сообщение
А какой пример?
Минимальный. Т.е. убрать лишние строки, которые не влияют на результат.
QGuest
8 / 8 / 0
Регистрация: 08.01.2013
Сообщений: 85
17.07.2014, 17:25  [ТС]     Ошибки линковки при использовании шаблонного класса #16
Цитата Сообщение от Tulosba Посмотреть сообщение
Минимальный. Т.е. убрать лишние строки, которые не влияют на результат.
Вот мин. проект скачать

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

Не по теме:

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

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.07.2014, 21:35     Ошибки линковки при использовании шаблонного класса
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
QGuest
17.07.2014, 21:35  [ТС]     Ошибки линковки при использовании шаблонного класса
  #20

Не по теме:

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

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

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