Направо ето какъв е проблемът. Имам например един клас (в случая с име А) и е разделен на дефиниция и декларация съответно в a.h и a.cpp. Направил съм и един Макеfile, за да мога да компилирам всичко, но има проблем.
Примерен код |
// а.h
#ifndef _A_H #define _A_H
template <class T> class A { T a;
public: void Set( T ); T Get() const; };
#endif |
Примерен код |
// a.cpp
#include "a.h"
template <class T> void A<T>::Set( T o ) { a = o; }
template <class T> T A<T>::Get() const { return a; }
|
Примерен код |
// main.cpp
#include <iostream> #include "a.h" using namespace std;
int main() { A<int> ob; ob.Set(10); cout << ob.Get() << endl;
return 0; } |
А това е и Макеfile-a
Примерен код |
CXX = g++ CXXFLAGS = -Wall -g -ansi -pedantic EXT =
OBJECTS = main.o a.o
all: A
A: $(OBJECTS) $(CXX) $(CXXFLAGS) $(OBJECTS) -o A$(EXT)
a.o: a.h a.cpp
main.o: main.cpp
.PHONY: clean clean: -rm $(OBJECTS) A$(EXT) |
Като стартирам make и се появява следното
Примерен код |
g++ -Wall -g -ansi -pedantic -c -o main.o main.cpp g++ -Wall -g -ansi -pedantic -c -o a.o a.cpp g++ -Wall -g -ansi -pedantic main.o a.o -o A main.o(.text+0x1a): In function `main': /primeri/c++/templ/main.cpp:9: undefined reference to `A<int>::Set(int)' main.o(.text+0x34):/primeri/c++/templ/main.cpp:10: undefined reference to `A<int>::Get() const' collect2: ld returned 1 exit status make: *** [A] Error 1 |
Оказа се, че като заменя навсякъде шаблоните с някакви конкретни типове като int примерно и се компилира успешно. Как мога обаче да го компилирам с тези шаблони?