Toon posts:

[C++] probleem bij template als base.

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben een stukkie aan het schrijven en ja ik weet dat er al een standaard vector is, maar daar gaat het niet om :D

dit is de base class:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
template <typename T> class Vector
{
public:
    explicit Vector(int s);
    Vector(Vector<T>& v);
    virtual ~Vector();
    
    virtual Vector<T>& operator=(const Vector<T>& v);
    
    virtual int extend();
//  virtual bool is_empty();
    virtual bool is_full();
    
private:
    T** data;
    int size;
    int used;
};



dit werkt wel:

code:
1
2
3
4
5
6
7
8
class RoomVector: public Vector<RoomData>
{
public:
    explicit RoomVector(int s) {};
    virtual ~RoomVector(){};
    virtual void add(int) {};     //Hier bij de declaratie van add dus meteen met {}
private:
};



en dit niet:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class RoomVector: public Vector<RoomData>
{
public:
    explicit RoomVector(int s) {};
    virtual ~RoomVector(){};
    virtual void add(int);  //en hier dus niet, maar met losse declaratie in los cpp file.
private:
};


//en dit in een cpp file natuurlijk met nodige includes.

void RoomVector::add(int room_nr)
{
     return;
}


als ik dit compileer gaat het bij de eerste versie goed, maar bij de 2e krijg ik een enorme lijst:
code:
1
2
3
4
5
6
7
8
9
RoomData.o(.gnu.linkonce.d._ZTV10RoomVector+0x10): undefined reference to `Vector<RoomData>::operator=(Vector<RoomData> const&)'
RoomData.o(.gnu.linkonce.d._ZTV10RoomVector+0x14): undefined reference to `Vector<RoomData>::extend()'
RoomData.o(.gnu.linkonce.d._ZTV10RoomVector+0x18): undefined reference to `Vector<RoomData>::is_full()'
RoomData.o(.gnu.linkonce.t._ZN10RoomVectorD1Ev+0x16): In function `RoomVector::~RoomVector [in-charge]()':
: undefined reference to `Vector<RoomData>::~Vector [not-in-charge]()'
RoomData.o(.gnu.linkonce.t._ZN10RoomVectorD0Ev+0x16): In function `RoomVector::~RoomVector [in-charge deleting]()':
: undefined reference to `Vector<RoomData>::~Vector [not-in-charge]()'
collect2: ld returned 1 exit status
make: *** [mesa_mud] Error 1


wie weet wat de oorzaak is, of ziet wat ik fout doe.. ik denk zelf eigenlijk aan het feit dat ik bij het aangeven van de base opgeef welk type de template aan moet nemen, aangezien als ik een willekeurige andere class als base gebruik het wel goed gaat.

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22-05 16:53
Dat komt omdat de compiler/linker de definitie van je template / derived template nodig heeft om te kunnen compilen/linken. ( Dus niet declaratie )

Totdat alles en iedereen het 'export' keyword ondersteund moet je gewoon onthouden dat de definitie van een template in je header thuishoort. Het is nu eenmaal niet anders. :)

[ Voor 11% gewijzigd door farlane op 10-09-2004 23:26 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Verwijderd

Topicstarter
farlane schreef op 10 september 2004 @ 23:25:
Dat komt omdat de compiler/linker de definitie van je template / derived template nodig heeft om te kunnen compilen/linken. ( Dus niet declaratie )

Totdat alles en iedereen het 'export' keyword ondersteund moet je gewoon onthouden dat de definitie van een template in je header thuishoort. Het is nu eenmaal niet anders. :)
of ik snap je verkeerd, of ik ben niet helemaal duidelijk geweest..

class Vector<T> staat in Vector.h met zijn members in Vector.cpp
class RoomVector staat in RoomData.h met zijn members in Roomvector.cpp

Vector.h staat included in RoomData.h en RoomData.h staat included in RoomData.cpp

EDIT: en Vector.h natuurlijk ook included in Vector.cpp

[ Voor 6% gewijzigd door Verwijderd op 10-09-2004 23:59 ]


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 18:13
Je snapt farlane verkeerd. ;)

Definities van template functions/classes moeten ook in de header file, omdat de compiler ze nodig heeft bij het genereren van code. (Wat niet geldt voor definities van 'gewone' functies en klassen.)

Kortom: zet eens #include "Vector.cpp" op het eind van Vector.h en zie of het dan wel werkt. :)

[ Voor 5% gewijzigd door Soultaker op 11-09-2004 03:12 ]


Verwijderd

Topicstarter
aaahhhh.. zit dat zo :D ja dat heeft de docent me nooit verteld toen we met templates bezig waren :( ga het meteen ff proberen.

EDIT: nou die fout is nu in ieder geval weg, maar nu krijg ik al mijn eigen programmeer fouten uit Vector.cpp voor me neus ;)

EDIT2: zo net ff mijn eigen troep gefixed, en alles werkt nu naar behoren _/-\o_ _/-\o_ bedankt.

[ Voor 51% gewijzigd door Verwijderd op 11-09-2004 02:51 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-05 23:07

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op 11 september 2004 @ 02:25:
aaahhhh.. zit dat zo :D ja dat heeft de docent me nooit verteld toen we met templates bezig waren :(
De reden hiervoor is omdat de T van Vector<T> nog onbekend is op het moment dat jij de implementatie van die Vector<T> geeft. De compiler kan dus nog geen code genereren, dat kan pas als ie weet met wat voor type hij geinstantieerd wordt, oftewel bij het gebruik van de vector (zoals je bij RoomVector doet dus, pas dan weet ie dat T=RoomData, alleen op het moment dat ie die RoomVector compilet kan ie de implementatie van Vector<RoomData> nergens zien, omdat je die in een andere file hebt gezet).

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1