Toon posts:

[C++] Template constructor trouble

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben bezig met een schoolopdracht en bij de eerste de beste opdracht waar ik templates bij nodig heb loop ik vast. Ik zal er wel overheenkijken! Zien jullie wat er mis is?

Array.h
-------------------------------
const int DefaultSize = 10;

template <class T>
class cArray
{
public:
cArray(int Size = DefaultSize);
~cArray() { delete [] pType; }

int GetSize() const { return iSize; }

private:
T *pType;
int iSize;
};


Array.cpp
--------------------------------------
#pragma hdrstop

#include "Array.h"

#pragma package(smart_init)

// Default constructor
template <class T>
cArray<T>::cArray(int Size)
{
iSize = Size;
pType = new T[iSize];
for (int i = 0; i < iSize; i++)
pType[i] = 0;
}


main.cpp
-----------------------------------------------
#include "Array.h"

#pragma hdrstop

#pragma argsused
int main(int argc, char* argv[])
{
cArray<int> intArray;

return 0;
}


De melding welke rond blijft spoken:

[linker error] Unresolved external 'cArray<int>::cArray<int>(int)'

Ik gebruik Borland C++Builder 6

Verwijderd

Probeer eens die constructor definitie in de header te zetten.

Verwijderd

Topicstarter
Ok... dat werkt! Dank je wel, maar kan iemand mij vertellen waarom? Ik snap er niet veel van waarom dat zo wel werkt :?

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 09-09 11:02
Waarschijnlijk wordt de broncode uit Array.cpp niet gecompileerd. Daardoor kan de linker dus ook de in dat bestand geimplementeerde symbols niet vinden. Door 'm nu in je header file te zetten, komt 'ie feitelijk in main.cpp te staan, die dus wel gecompileerd wordt.

Een andere mogelijkheid is dat het gecompileerde bestand (Array.o) niet door de linker gevonden kon worden, terwijl dit bestand wel gecompileerd was.

Ik heb geen ervaring met Builder, maar waarschijnlijk moet je Array.cpp aan je huidige project toevoegen. Als 'ie 'm dan niet automatisch meeneemt, hoop ik dat iemand met meer verstand van zaken je verder kan helpen.

Zoals je het nu hebt opgelost is zeker niet netjes en veroorzaakt op de lange termijn waarschijnlijk conflicten.

  • Orphix
  • Registratie: Februari 2000
  • Niet online
Op zondag 21 april 2002 15:35 schreef rvlieshout het volgende:
Ok... dat werkt! Dank je wel, maar kan iemand mij vertellen waarom? Ik snap er niet veel van waarom dat zo wel werkt :?
Wanneer je templates gebruikt moet de compiler tijdens het compileren alle code kunnen vinden. Immers voor elke class 'T' wordt bij het compileren het juiste datatype (in dit geval int) 'ingevuld'. Wanneer de compiler nu main.cpp gaat compileren is er op geen enkele manier een verwijzing naar array.cpp, waar de constructor code staat.

Daarom staat bijvoorbeeld alles (?) van de STL in header-files, dit zijn voornamelijk templates en moeten at compile-time beschikbaar zijn.

Verwijderd

Topicstarter
Dank je voor je uitleg. Lang geleden heeft iemand mij dit verteld, maar ik was het helemaal vergeten... |:(
Wel logisch dat ik dan een linker error kreeg.

Dank u allen

  • Orphix
  • Registratie: Februari 2000
  • Niet online
Op zondag 21 april 2002 15:47 schreef Soultaker het volgende:
Zoals je het nu hebt opgelost is zeker niet netjes en veroorzaakt op de lange termijn waarschijnlijk conflicten.
Voor templates is het heel normaal om alles in de header te zetten. Het nadeel van templates is dus ook dat het moeilijker wordt om je intellectuele eigendommen te behouden. Maar meestal zijn templates toch voornamelijk makkelijk voor containers en en relatief kleine classes.

Ik blijf het 1 van de mooiste features van C++ vinden :)

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-09 00:49
Wat je nodig hebt is export, zodat de compiler weet dat je template in de .obj moet. Maar dat ondersteunt Borland nog niet, dus moet het in de header.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 09-09 11:02
Ik had uitsluitend naar de melding "unresolved external" gekeken. |:( Luister naar Orphix, die heeft het beter begrepen. ;)
Pagina: 1