Ошибка undefined reference to + list<T>::iterator it? [дубликат]

282
13 ноября 2017, 21:19

На данный вопрос уже ответили:

  • Вынести метод шаблонного класса в .cpp 3 ответа

Компилятор будто не видит конструктор с параметрами и деструктор, но все есть. Я не понимаю откуда эта ошибка берется. Объясните пожалуйста!

Код ошибки:

main.o: In function `main':
C:\Users\../main.cpp:14: undefined reference to `ControllerIOFStream<UserAccount>::ControllerIOFStream(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
C:\Users\../main.cpp:14: undefined reference to `ControllerIOFStream<UserAccount>::~ControllerIOFStream()'
collect2.exe: error: ld returned 1 exit status

Создание объекта класса ControllerIOFStream:

MAIN.cpp

ControllerIOFStream<UserAccount> CIOUserAccounts(str);

Класс описан в двух файлах: ControllerIOFStream.h и ControllerIOFStream.cpp

ControllerIOFStream.h:

/*
 * ControllerIOFStream.h
 *
 *  Created on: 12 нояб. 2017 г.
 *      Author: Дмитрий
 */
#include <string>
#include <list>
#include <fstream>
using namespace std;
template <class T>
class ControllerIOFStream {
private:
    string path;
public:
    ControllerIOFStream();
    ControllerIOFStream(string);
    ~ControllerIOFStream();
    list<T> readFile(list<T>);
    list<T> writeFile(list<T>);
};

ControllerIOFStream.cpp:

/*
 * ControllerIOFStream.cpp
 *
 *  Created on: 12 нояб. 2017 г.
 *      Author: Дмитрий
 */
#include "ControllerIOFStream.h"
template<class T>
ControllerIOFStream<T>::ControllerIOFStream():
        path(""){
}
template<class T>
ControllerIOFStream<T>::ControllerIOFStream(string path) :
        path(path) {
}
template<class T>
ControllerIOFStream<T>::~ControllerIOFStream() {
}
template<class T>
list<T> ControllerIOFStream<T>::readFile(list<T> List){
    ifstream inputStream(path);
    size_t size;
    T buf;
    inputStream>>size;
    for(size_t i=0;i<size;i++){
        inputStream>>buf;
        List.push_back(buf);
    }
    inputStream.close();
    return List;
}
template<class T>
list<T> ControllerIOFStream<T>::writeFile(list<T> List){
    ofstream outputStream(path);
    outputStream<<List.size()<<"\n";
//for????????????????????????????????????????????????????????????
//  for(list<T>::iterator it=List.begin();it<List.end();++it){
//      outputStream<<*it<<"\n";
//  }
    outputStream.close();
    return List;
}

Есть еще вопрос: почему не работает код в методе writeFile(list List)?

Сам код под кучей знаков вопроса.

Answer 1

В очередной раз те же грабли...

Нельзя реализацию шаблона выносить в отдельный .cpp-файл! Откуда при компиляции этого (ControllerIOFStream.cpp) файла знать, что (с каким параметром шаблона) будет инстанцироваться в другом файле?

А в этом другом файле (main.cpp) - откуда знать, как инстанцировать шаблон, если нет доступа к коду реализации?

То, что у вас в ControllerIOFStream.cpp - должно быть перенесено в .h-файл. Или нужно в нем явно инстанцировать ControllerIOFStream<UserAccount>...

READ ALSO
Какой компилятор для С++ лучше? [требует правки]

Какой компилятор для С++ лучше? [требует правки]

Не можете подсказать, какой компилятор для С++ лучше? Изучил основы С++ и хочу попрактиваться

227
C++ Преобразование vector&lt;string&gt; в int

C++ Преобразование vector<string> в int

Добрый вечерУ меня имеется вот такая задачка: Создайте вектор, хранящий десять строковых значений " zero " , " one " , "

292
XML документация с++ в Visual Studio

XML документация с++ в Visual Studio

Недавно узнал, что /// в Visual Studio используется для создания Xml документацииТакже выяснил можно просматривать описание функций с помощью тега...

215
Разбиение строки на блоки по 4 символа [требует правки]

Разбиение строки на блоки по 4 символа [требует правки]

Разбиение строки Str на отдельные блоки длиной по 4 символа пробеламиСтрока Str вводится с клавиатуры

194