[C++] Szablony w projektach multiplikowych

soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

[C++] Szablony w projektach multiplikowych

Post autor: soku11 »

WITAM!
Pojawil sie problem podczas uzywania szablonow klas w projektach majacych kilka plikow. Oto te pliki:
main.cpp:

Kod: Zaznacz cały

#include "array.h"
#include "main.h"

int main()
{
  array<int> tabliczka;
  //array tabliczka;
  return 0;
}

main.h:

Kod: Zaznacz cały

#ifndef MAIN_H_INCLUDED
#define MAIN_H_INCLUDED

#include <iostream>
using namespace std;

// jakies tam funkcje

#endif // MAIN_H_INCLUDED

array.cpp:

Kod: Zaznacz cały

#include "array.h"

template<class type> array<type>::array()
{
  cout << "Konstruktor." << endl;
}


template<class type> array<type>::~array()
{
  cout << "Destruktor." << endl;
}

/*
array::array()
{
  cout << "Konstruktor." << endl;
}
*/
/*
array::~array()
{
  cout << "Destruktor." << endl;
}
*/
array.h:

Kod: Zaznacz cały

#ifndef ARRAY_H_INCLUDED
#define ARRAY_H_INCLUDED

#include <iostream>
using namespace std;


template<class type> class array
{
  public:
    array();
    ~array();
};

/*
class array
{
  public:
    array();
    ~array();
};
*/
#endif // ARRAY_H_INCLUDED

Problem jest gdy uzywam szablonow :/ Gdy zrobie odwrotnie komentarze, tj zwykla klase zostawiam a szablonowa 'zakomentuje' i zmienie wywolanie w main, to wszystko pieknie dziala. Natomiast przy probie kompilacji takich plikow dostaje komunikat o bledzie:

Kod: Zaznacz cały

obj\Debug\main.o||In function `main':|
C:\Program Files\CodeBlocks\My\Projekt2\main.cpp|7|undefined reference to `array<int>::array()'|
C:\Program Files\CodeBlocks\My\Projekt2\main.cpp|8|undefined reference to `array<int>::~array()'|
||=== Build finished: 2 errors, 0 warnings ===|
Czego to jest wina bo ja juz nie moge nic wymyslec :/ Z gory dzieki za kazda pomoc. POZDRO
Rafal88K
Użytkownik
Użytkownik
Posty: 311
Rejestracja: 15 mar 2007, o 16:52
Płeć: Mężczyzna
Lokalizacja: Lublin
Podziękował: 28 razy
Pomógł: 54 razy

[C++] Szablony w projektach multiplikowych

Post autor: Rafal88K »

Problem jest w tym, że kompilator potrzebuje definicji klasy i definicji metod w jednym pliku, żeby wygenerować metody konkretnych typów. Możesz go rozwiązać jeśli definicję metod umieścisz w pliku array.h. Ale może to wyglądać trochę dziwnie więc możesz stworzyć arraydef.h z definicjami metod i dodać: #include "arraydef.h" lub na końcu array.h:

Kod: Zaznacz cały

#ifndef _ARRAY_DEF_

#include "array.cpp"

#endif
i na początku array.cpp:

Kod: Zaznacz cały

#define _LISTA_DEF_
Możesz jeszcze w array.h:

dodać po prostu:

Kod: Zaznacz cały

#include "grid.cpp"
a w array.cpp:

Kod: Zaznacz cały

#ifndef _GRID_DEF_
#define _GRID_DEF_

#include "grid.h"

//...

#endif
Ale moim zdaniem wygodniejsza jest wersja z samym #define w array.cpp

Powinno działać

Jest jeszcze słowo kluczowe export - mówi, że definicje szablonu powinny być dostępne we wszystkich plikach źródłowych, ale niestety działa to w niewielu kompilatorach.
ODPOWIEDZ