Toon posts:

[C++] Methode template klasse buiten klasse defineren

Pagina: 1
Acties:

Verwijderd

Topicstarter
Misschien is dit een basic vraag, maar templates blijven lastig.

Ik heb een template klasse
C++:
1
template <class T> class TMatrix

en nog een
C++:
1
template <class T> class TQuaternion

In de TMatrix klasse heb ik een methode die als argument een (constante) referentie krijgt naar een object van de TQuaternion klasse:
C++:
1
2
3
4
5
// inline
void operator=(const TQuaternion<T> &q)
{
    ...
}

Als ik die methode inline defineer is er geen probleem maar als ik hem buiten de klasse defineer krijg ik een linker fout :(
C++:
1
2
3
4
5
// buiten klasse declaratie
template <class T> void TMatrix<T>::operator=(const TQuaternion<T> &q)
{
    ...
}

De linker geeft een fout in de trant van 'ik kan de implementatie van die methode niet vinden'. Ik heb meerdere methoden van de template klassen buiten de klasse gedefineerd en die gingen goed. Maar die hadden dan ook geen template klasse als argument.
Het enige dat ik kan bedenken is dat de methode die ik buiten de klasse defineer anders is dan de methode die ik heb gedeclareerd. Maar als dat het geval is, wat doe ik dan fout?

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 22-08 01:56
De C++ compiler van GCC 3.2.1 vindt je code prima, hoor. Welke compiler gebruik je?

Ik neem trouwens aan dat je de definitie wel in je headerfile hebt staan (en dus niet ergens in een source file die je los compileert), want als dat al onderdeel is van de C++ specificatie (er staat me wel zoiets bij) dan wordt het door praktisch geen enkele compiler ondersteund.

[ Voor 64% gewijzigd door Soultaker op 16-06-2003 19:38 ]


Verwijderd

De implementatie van een template functie moet in de header file zelf staan. Of je moet de file met de implementatie includen in je header file (onderaan).

Verwijderd

Topicstarter
Soultaker schreef op 16 June 2003 @ 19:37:
De C++ compiler van GCC 3.2.1 vindt je code prima, hoor. Welke compiler gebruik je?
Ik gebruik GCC 3.2.2-r1.
Ik neem trouwens aan dat je de definitie wel in je headerfile hebt staan (en dus niet ergens in een source file die je los compileert), want als dat al onderdeel is van de C++ specificatie (er staat me wel zoiets bij) dan wordt het door praktisch geen enkele compiler ondersteund.
Ik heb het prototype inderdaad in de headerfile gedefineerd:
C++:
1
2
3
4
5
6
7
// in header file
template <class T> class TMatrix
{
    ...
    void operator=(const TQuaternion<T> &q);
    ...
};


Ik heb trouwens een fout gemaakt in mijn eerste post. De fout treed niet alleen op bij functies die een template klasse als argument hebben maar slechts bij enkele van die functies :? Het wordt alleen maar vreemder.

[ Voor 12% gewijzigd door Verwijderd op 16-06-2003 21:41 ]


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
Verwijderd schreef op 16 June 2003 @ 21:38:
Ik heb het prototype inderdaad in de headerfile gedefineerd:
C++:
1
2
3
4
5
6
7
// in header file
template <class T> class TMatrix
{
    ...
    void operator=(const TQuaternion<T> &q);
    ...
};
Niet gedefinieerd dus, maar gedeclareerd.

Declaratie = "er is een ..."
Definitie = "hier is de ..."

Voor (functie) templates moet ook de definitie beschikbaar zijn in de file waar deze gebruikt wordt, i.t.t. gewone functies waar een declaratie genoeg is. De GCC linker kan namelijk functie templates niet linken (keyword 'export' ontbreekt voor de googlaars onder ons)

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


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op 16 June 2003 @ 18:31:
De linker geeft een fout in de trant van 'ik kan de implementatie van die methode niet vinden'.
Het zou wel fijn zijn als je de precieze foutmelding hier vermeldt, anders blijft het voor ons natuurlijk ook maar gissen :)

Maar goed, wat je eigenlijk moet doen is de functie-implementaties ook in de headerfile zetten

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.


  • koli-man
  • Registratie: Januari 2003
  • Laatst online: 29-06 12:23

koli-man

Bartender!!!!

.oisyn schreef op 17 June 2003 @ 02:04:
[...]


Maar goed, wat je eigenlijk moet doen is de functie-implementaties ook in de headerfile zetten
Of onder aan de header de c - file includen, maar bovenstaande lijkt me beter

Hey Isaac...let's go shuffleboard on the Lido - deck...my site koli-man => MOEHA on X-Box laaaiiiff


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
koli-man schreef op 17 June 2003 @ 08:32:
[...]
Of onder aan de header de c - file includen, maar bovenstaande lijkt me beter
Werkt alleen als de c-file verder niks bevat. Eén gewone functie en de linker klaagt over duplicate definitions - bovenstaande is dus beter.

Ikzelf gebruik weleens het compromis van een .inl file die deze inline definities bevat. Deze wordt dus wel geinclude in de .h

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

Pagina: 1