Автор Тема: Проблем при компилация на С++ с шаблони?  (Прочетена 1184 пъти)

plamen_t

  • Напреднали
  • *****
  • Публикации: 170
    • Профил
Направо ето какъв е проблемът. Имам например един клас (в случая с име А) и е разделен на дефиниция и декларация съответно в 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 примерно и се компилира успешно. Как мога обаче да го компилирам с тези шаблони?
Активен

tarator

  • Напреднали
  • *****
  • Публикации: 849
    • Профил
Проблем при компилация на С++ с шаблони?
« Отговор #1 -: Jul 12, 2007, 22:04 »
Сложи кода от a.cpp в a.h.
Активен

A gentleman is one who is never rude unintentionally. - Noel Coward

Emooo

  • Гост
Проблем при компилация на С++ с шаблони?
« Отговор #2 -: Jul 12, 2007, 23:23 »
най долу във а.cpp сложи

template class A<int>;

прочети за template instancing или нещо такова това се прави само когато темплейта е в cpp файл.



Активен

plamen_t

  • Напреднали
  • *****
  • Публикации: 170
    • Профил
Проблем при компилация на С++ с шаблони?
« Отговор #3 -: Jul 19, 2007, 02:50 »
Със template class A<int>; в края на а.h стана. То явно трябва да се указва как точно ще се ползва шаблона, за да се знае и какъв object код да се генерира.
Активен