[ jeremy @ 08.05.2002. 10:08 ] @
Imam problem kod smestanja klasa u posebne module, u klasama koristim sablone. Napisacu vam ovde neki prost primer klase za objekat koji ne radi nista narocito ali ne mogu da ga prevedem komandom make, dok kad ukinem sablone i umesto T svuda stavim npr int sve se normalno prevede :(

greska je:
class.h: In function `void __static_initialization_and_destruction_0(int, int)':
class.h:15: no matching function for call to `klasa<long int>::klasa ()'
class.h:11: candidates are: klasa<long int>::klasa(long int)
class.h:13: klasa<long int>::klasa(const klasa<long int> &)

---[ makefile ] ------

test: main.o class.o
g++ -o test main.o class.o

main.o: main.cc class.h
g++ -c -o main.o main.cc

class.o: class.cc class.h
g++ -c -o class.o class.cc

---[ class.h ] -------

#ifndef class_h
#define class_h

extern "C++" {

template <class T>
class klasa {
private:
T a;
public:
klasa( T i );
void write();
};

klasa <long int> t;

#endif

}

---[ class.cc ]-----

#include <iostream>
#include "class.h"

extern "C++" {

template <class T>
klasa <T> ::klasa( T i ) {
a=i;
}

template <class T>
void klasa <T> ::write() {
cout << a << endl;
}


}

---[ main.cc ]--------

#include <iostream>
#include "class.h"

main() {
klasa <long int> a (15);
a.write();
}

------------------------

sto se tice prevoda sve je uredu, problem je sa linkovanjem :(

pozdrav, Igor
[ sspasic @ 08.05.2002. 17:06 ] @
Fali ti default kotruktor za klasu. Ali imas jos par grescica.
Citat:
jeremy:
---[ class.h ] -------

#ifndef class_h
#define class_h

extern "C++" {

template <class T>
class klasa {
private:
T a;
public:
klasa( T i );
void write();
};

klasa <long int> t;

Ovde zoves default constructor, a on ne postoji. Kompajler ga sam pravi samo ako
klasa nema nijedan drugi konstruktor, a ova ima.

Inace, zasto definises promenljivu u hederu? Tako ce svaki fajl koji ukljuci ovaj heder
imati svoju kopiju t. Javice se ovde i greska u linkovanju - dupliran simbol.
Najgore je sto mislim da prema najnovijim izmenama C++ kompajler/linker nece ni prijaviti gresku, a imaces nekoliko kopija t jer se static podrazumeva za sve promenljive koje nisu extern, ali nemoj da me drzis za rec.
Stavi u heder:
Code:

extern klasa <long int> t; 

a u neki cc fajl:
Code:

klasa <long int> t; 


Citat:

---[ class.cc ]-----

#include <iostream>
#include "class.h"

extern "C++" {

template <class T>
klasa <T> ::klasa( T i ) {
a=i;
}

template <class T>
void klasa <T> ::write() {
cout << a << endl;
}


}


telo template funkcija je u cc fajlu. I tu ce biti greske kod linkovanja posto
kompajler nece napraviti ove dve funkcije za long int. Ili prebaci template definicije funkcija u heder
ili u main.cc dodaj include i cc fajla.
Moze i ovako da ostane ako na kraju class.cc eksplicitno instanciras klasu za long int:
Code:

template klasa<long int>;

Ovo moze da bude losa ideja posto ce sablon onda moci da se koristi samo za long int,
odnosto za one T za koje si eksplicitno instancirao klasu.
Citat:

---[ main.cc ]--------
#include <iostream>
#include "class.h"

main() {
klasa <long int> a (15);
a.write();
}



[code]
int main () {
...
return 0;
}
[ Dragi Tata @ 08.05.2002. 17:08 ] @
Već smo dva puta objašnjavali ovo.

Pogledaj

http://www.elitesecurity.org/tema.php?TopicID=7032

i

http://www.elitesecurity.org/tema.php?TopicID=5549