/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
Adskilt implementation af templates?
Fra : Klaus Petersen


Dato : 02-04-04 21:29

Godaften.

Jeg har lavet en template klasse i temp.h.

temp.h bliver include't fra min main.cpp, hvor jeg i main erklærer en
variabel af min template type.

Det virker også fint så længe både definationen af min template og
implementationen af templaten ligger i samme fil (temp.h).

Men når jeg forsøger at adskille source fra header, kommer den med en masse
"undefined reference"s (dvs. implementationen flyttes i en temp.cpp, der
inkluderer temp.h)

Er det fordi at det jeg kalder implementationen egentlig er en del af min
template defination?
Er det muligt at opdele det i 2 som man normalt gør med klasser?

Klaus.



 
 
Mogens Hansen (02-04-2004)
Kommentar
Fra : Mogens Hansen


Dato : 02-04-04 21:59


"Klaus Petersen" <spectual2@getTOnet.dk> wrote:

[8<8<8<]
> Det virker også fint så længe både definationen af min template og
> implementationen af templaten ligger i samme fil (temp.h).

Det er typisk det nemmeste at gøre sådan - og derfor også hvad man typisk
gør.
Det kaldes "inclusion model"

>
> Men når jeg forsøger at adskille source fra header, kommer den med en
masse
> "undefined reference"s

jeps

> (dvs. implementationen flyttes i en temp.cpp, der
> inkluderer temp.h)

Du kan eventuelt gøre det modsatte:
lade temp.h includere temp.cpp, og derved opnå en vist fornemmelse af
adskillelse - selvom den reelt ikke er der.

>
> Er det fordi at det jeg kalder implementationen egentlig er en del af min
> template defination?

Det er fordi templaten ikke er blevet instantieret. Populært sagt har
compileren ikke lagt assembler kode ud for den pågældende template med de
anvendte template parametre, og derfor kan linkeren ikke finde assembler
koden.

Når du har hele templaten, både erklæring og definition, i headerfilen vil
compileren (hvis den bruger "greedy instantiation" som er mest almindeligt)
instantiere template funktionen, når den ser at den bliver brugt.
Dermed kan linkeren finde den, og så slipper du for "undefined references".

> Er det muligt at opdele det i 2 som man normalt gør med klasser?

Ja.
C++ har et keyword "export" der netop sigter på dette. Det kaldes
"separation model".
Problemet er blot at der kun er een compiler (Comeau) der pt. understøtter
dette.

Se iøvrigt den glimrende bog
C++ Templates, The Complete Guide
Daveed Vandevoorde, Nicolai M. Josuttis
ISBN 0-201-73484-2
der bl.a. beskriver detaljerne omkring export og instantierings modeller.
(Det er iøvrigt den ene af forfatterne, Daved Vandevoorde, der har
implementeret "export" funktionaliteten i Comeau compileren)

Venlig hilsen

Mogens Hansen



Denker (04-04-2004)
Kommentar
Fra : Denker


Dato : 04-04-04 11:51

I din main fil kan du bare skrive:

#include "temp.h"
#include "temp.cpp"

så virker det som ved almindelige klasser.

/Denker



Mogens Hansen (04-04-2004)
Kommentar
Fra : Mogens Hansen


Dato : 04-04-04 12:17


"Denker" <losdenker@hotmail.com> wrote:
>
> #include "temp.h"
> #include "temp.cpp"

Hvorfor ikke blot includere "temp.cpp" i "temp.h" (som jeg beskrev, og som
der står i den nævnte bog), således at det bliver helt almindeligt at bruge
?

Venlig hilsen

Mogens Hansen



Søg
Reklame
Statistik
Spørgsmål : 177459
Tips : 31964
Nyheder : 719565
Indlæg : 6408176
Brugere : 218881

Månedens bedste
Årets bedste
Sidste års bedste