[Turbo C++] szablony, błąd linkowania

0

Witam, jak wielu przede mna, mam problem z linkowaniem szablonow
Mam taki oto prosty, przykladowy programik zlozony z dwoch modulow :

//plik pasja.h

template<class param>
class pasja
{
private:
	char* nazwa;
        param jaki_opus;
public:
	pasja(char* na, param op);
};
//plik pasja.cpp
#include "pasja.h"

template<class param>
pasja<param>::pasja(char* na, param op) : nazwa(na)
{
    jaki_opus = op;
    cout<<"To ja, konstruktor " << nazwa << endl;
}
#include "pasja.h"

int main(int argc, char* argv[])
{
        pasja<int> muzyk("Sw. Mateusza", 37);
}

Moduly kompiluja sie poprawnie, jednak nie chca sie linkowac. Dostaje komunikat :

[Linker Error] Error: Unresolved external 'pasja<int>::~pasja<int>()' referenced from C:\USERS\DAWID\DOCUMENTS\BORLAND STUDIO PROJECTS\STR 118\DEBUG_BUILD\UNIT1.OBJ

Uzywam srodowiska Turbo C++. Linker ustawiony jest nastepujaco :
Generate definitions for all templates instances and merge duplicates.
Wiec tutaj wszystko powinno byc wporzadku. Gdzie zatem tkwi blad? Z góry dziekuje za pomoc ;)

0

Dodaj destruktor, choćby i pusty.

0

@Loloki, tak się składa, że niejawnie tworzone są cztery metody jeżeli nie zostały stworzone jawnie - konstruktor domyślny, kopiujący, operator przypisania i destruktor właśnie.
Co do błędu zaś - dziwna sprawa... inna sprawa, że kompilatory Borlanda wiele wspólnego ze standardem C++ nie mają.

0

Bo ja wiem, Dev CPP wywala mi się na klasach bez konstruktora i destruktora. Muszą być choćby puste. Zwraca przy tym bardzo podobne błędy ;)

0

A możesz podać przykład takiego kodu? Dev używa MinGW a co za tym idzie G++, a ten nawet takie 'egzotyczne' cuda jak pseudodestruktory mniej\więcej poprawie obsługuje chociaż w innych miejscach taki zgodny ze standardem to on nie jest.

0

Dzieki za odzew. Faktycznie - NIE jest to wina brakujacego destruktora.

//plik pasja.h

template<class param>
class pasja
{
private:
        char* nazwa;
        param jaki_opus;
public:
        pasja(char* na, param op);
        ~pasja();
};
//plik pasja.cpp
#include "pasja.h"

template<class param>
pasja<param>::pasja(char* na, param op) : nazwa(na)
{
    jaki_opus = op;
    cout<<"To ja, konstruktor " << nazwa << endl;
}

template<class param>
pasja<param>::~pasja()
{}
#include "pasja.h"

int main(int argc, char* argv[])
{
        pasja<int> muzyk("Sw. Mateusza", 37);
}

W tym momencie zamiast jednego, dostaje dwa bledy :

[Linker Error] Error: Unresolved external 'pasja<int>::~pasja<int>()' referenced from C:\USERS\DAWID\DOCUMENTS\BORLAND STUDIO PROJECTS\STR 118\DEBUG_BUILD\UNIT1.OBJ
[Linker Error] Error: Unresolved external 'pasja<int>::pasja<int>(char *, int)' referenced from C:\USERS\DAWID\DOCUMENTS\BORLAND STUDIO PROJECTS\STR 118\DEBUG_BUILD\UNIT1.OBJ

Jeden dla konstruktora i jeden dla destruktora.

0

wstaw wszystkie defiinicje funkcji do pliku nagłówkowego.

0

Przeniesienie definicji funkcji do pliku naglowkowego faktycznie dziala. Jednak nie jest to rozwiazanie problemu, lecz tylko obejscie go. Ktos wie jak rozwiazac przyczyne problemu, a nie tylko objawy?

Anyway - i tak wielkie dzięki ! [browar]

0

Nie do końca jest to "obejście".
Jest to jedyna metoda tworzenia klas szablonowych jeśli chodzi o kompilatory Borlanda.
Kojarzysz ustawienie, o którym sam wspomniałeś?

Generate definitions for all templates instances and merge duplicates.

To ustawienie jest właśnie dla ciebie - wszystkie deklaracje i definicje wtawiasz do plików h, dołączasz do wszystkich modułów. W efekcie masz w ch... i jeszcze trochę tych samych definicji dla szablonów. Linkerowi mówisz, żeby wszystko to połączył w jedno.

Tak się postępuje z szablonami we wszystkich kompilatorach, które nie obsługują słowa kluczowego export.

0

.. i czyta sie archiwum: http://4programmers.net/Forum/456660?h=szablonem gdzie wszystko dosc obszernie jest wyjasnione, patrz tez podane linki

1 użytkowników online, w tym zalogowanych: 0, gości: 1