Я создал пример ниже, чтобы проиллюстрировать мою проблему.По сути, когда я разделяю класс шаблона на отдельный файл .h / .cpp, я получаю неразрешенные символы для конструктора.Используя один файл, он прекрасно компилируется.Что вызывает это?
fruits.cpp:
#include "apple.h"
class FruitsDB {
public:
void addApple();
};
void FruitsDB::addApple() {
Apple<int> m;
}
int main() {
FruitsDB fruits;
return 0;
}
apple.h:
template <typename T>
class Apple {
public:
Apple();
~Apple();
};
apple.cpp
template <typename T>
Apple<T>::Apple() {
}
template <typename T>
Apple<T>::~Apple() {
}
Thisвыдает ошибку компилятора:
g++ -c -o fruits.o fruits.cpp
g++ -c -o apple.o apple.cpp
g++ -Wall -ggdb fruits.o apple.o -o fruits
Undefined symbols:
"Apple<int>::Apple()", referenced from:
FruitsDB::addApple() in fruits.o
"Apple<int>::~Apple()", referenced from:
FruitsDB::addApple() in fruits.o
ld: symbol(s) not found
Я думал, что это был мой код, вызывающий проблему, но объединение файлов не создает проблему.Я предполагаю, что мне нужно включить файл где-то, где я не.Я полностью потерян.
Примечание: добавление template <> Apple<int>::Apple() {}
в apple.cpp решит эту проблему, но я использую шаблоны, чтобы избежать необходимости писать все эти конструкторы и т. Д.