Это мои файлы:
-------- [c.hpp] --------
#ifndef _C
#define _C
#include<iostream>
class C
{
public:
template<class CARTYPE> void call(CARTYPE& c);
};
#endif
-------- [c.cpp] --------
#include "c.hpp"
template<class CARTYPE> void C::call(CARTYPE& c)
{
//make use of c somewhere here
std::cout<<"Car"<<std::endl;
}
-------- [v.cpp] --------
class Merc
{};
-------- [main.cpp] --------
#include "c.hpp"
#include "v.cpp"
//#include "c.cpp"
int main()
{
Merc m;
C someCar;
someCar.call(m);
}//main
Я могу сгенерировать файлы ".o" для всех вышеперечисленных файлов с помощью команды g ++ -c main.cpp и g ++ -c c.cpp и так далее.
Но когда я пытаюсь связать файлы ".o" с g ++ -o car c.o main.o v.o
Я получаю эту ошибку:
main.o: In function `main':
main.cpp:(.text+0x17): undefined reference to `void C::call<Merc>(Merc&)'
collect2: ld returned 1 exit status
Ошибка исчезает, когда я раскомментирую строку #include "c.cpp" в main.cpp, но я считаю, что включать файл cpp таким способом может быть плохой практикой. Я делаю это неправильно? Есть ли лучший способ обслуживать шаблонные объявления при создании отдельных объектных файлов и их связывании?
PS: я использую шаблонную функцию в гораздо более сложной структуре классов. То, что показано здесь, является лишь небольшим примером, чтобы показать вам тип ошибки, с которой я сталкиваюсь.