|
| 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
| |
|
|