Это мои файлы:шаблонные функции сообщается как "неопределенная ссылка" во время компиляции
-------- [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» файлы с г ++ -o автомобиль совместно main.o VO Я получаю эту ошибку:
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. Я делаю это неправильно? Есть ли лучший способ удовлетворить шаблонные объявления при создании отдельных объектных файлов и их связывании? p.s: Я использую шаблонную функцию в гораздо более сложной структуре класса. То, что показано здесь, является лишь небольшим примером для того, чтобы показать вам ту ошибку, с которой я столкнулся.
См. Http://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file –
@Pavel: Решение, на которое вы указали, является точным решением, которое мне нужно , Спасибо :) – Nav