Avatar billede driis Nybegynder
04. november 2003 - 20:26 Der er 12 kommentarer og
1 løsning

Initiering af statisk medlem i template klasse.

Hej, jeg har følgende:
template<int dim,typename T>
class Vector
{
public:
...
private:
  struct heapBlok
  {
      heapBlok * next;
  };
  static heapBlok * heapPtr;
};

Nu vil jeg initiere heapPtr, men hvordan gør jeg det ? Jeg har bl.a. prøvet:
template<int dim,typename T> Vector<dim,T>::heapBlok * Vector<dim,T>::heapPtr = 0;
Men det virker ikke. Hvordan skal den så se ud ?
Avatar billede arne_v Ekspert
04. november 2003 - 20:39 #1
Det her compiler:

#include <stdlib.h>

template<int dim,typename T>
class Vector
{
public:
private:
  struct heapBlok
  {
      heapBlok * next;
  };
  static heapBlok *heapPtr;
};

Vector<2,int>::heapBlok *Vector<2,int>::heapPtr = NULL;
Avatar billede driis Nybegynder
04. november 2003 - 20:49 #2
Det gør det også her. Men jeg vil gerne kunne initiere heapPtr, uanset hvilke parametre, der gives med til templaten. Er det ikke muligt ?
Avatar billede arne_v Ekspert
04. november 2003 - 20:55 #3
Det tror jeg ikke at du kan.

Hvad pokker skulle compileren putte i obj filen ?
Avatar billede driis Nybegynder
04. november 2003 - 22:10 #4
Men, heapPtr har jo samme type, uanset hvad parametrene er. Jeg har også en anden statisk variabel, static int heapTotal, som jeg godt kan initiere:

template<int dim,typename T> int Vector<dim,T>::heapTotal = 0 ;

Ovenstående kan compile.
Avatar billede arne_v Ekspert
04. november 2003 - 22:18 #5
Problemet må være at int en en primitiv kendt type mens det er heapBlok ikke.
Avatar billede driis Nybegynder
04. november 2003 - 22:18 #6
Kan du i øvrigt fortælle mig, hvorfor:

template<int dim,typename T>
class Vector
{
friend ostream &operator<<(ostream &ud, Vector<dim,T> &v)
{
    for ( int i = 0 ; i < dim ; i++ )
        ud << v.value[i];

    return ud;
}
public:
...
private:
...
};

kan compile, mens

template<int dim,typename T>
class Vector
{
friend ostream &operator<<(ostream &ud, Vector<dim,T> &v);
public:
private:
};

og i cpp filen:
template<int dim,typename T>
friend ostream &operator<<(ostream &ud, Vector<dim,T> &v)
{
    for ( int i = 0 ; i < dim ; i++ )
        ud << v.value[i];

    return ud;
}

... ikke kan compile ?

Fejlen jeg får fra MS VC er: error C2255: 'operator`<<'' : a friend function can only be declared in a class
Avatar billede arne_v Ekspert
04. november 2003 - 22:20 #7
Den her compiler:

#include <stdlib.h>

struct heapBlok
{
  heapBlok * next;
};

template<int dim,typename T>
class Vector
{
public:
private:
  static heapBlok *heapPtr;
};

template<int dim,typename T> heapBlok *Vector<dim,T>::heapPtr = NULL;
Avatar billede arne_v Ekspert
04. november 2003 - 22:21 #8
Der skal da kun friend metode definitionen (inden i class) - ikke
i implementationen.
Avatar billede driis Nybegynder
04. november 2003 - 22:23 #9
Jeg har i øvrigt løst første problem ved at erklære struct heapBlok uden for klassen. Så virker
template<int dim,typename T> heapBlok * Vector<dim,T>::heapPtr = 0;
... men jeg ville stadig foretrække, hvis jeg kunne gøre som først tænkt. Så hvis der er nogen der har en løsning på det problem, må de endelig sige til.
Avatar billede driis Nybegynder
04. november 2003 - 22:28 #10
Selvfølgelig. Du må gerne lægge et svar.
Avatar billede arne_v Ekspert
04. november 2003 - 22:31 #11
ok
Avatar billede segmose Nybegynder
06. november 2003 - 09:41 #12
Problemet må være instantieringerne af heapPtr,

template<int dim,typename T> heapBlok *Vector<dim,T>::heapPtr = NULL;

hvis denne skrives i headeren og du du bruger Vector i 2 forskellige object filer burde du få en fejl da den så er defineret 2 gange, hvis den kun skives i en object fil får du måske ikke alle kombinationer af dim med.

Du vil kunne have en variable dim som du fx. indlæser dynamisk

cin >> dim

x = new Vector<dim, int>;

hvordan skal runtime delen kunne oprette en ny statisk variable heapPtr der passer til Vector<dim, int> ?
Avatar billede driis Nybegynder
06. november 2003 - 16:14 #13
segmose >> Det har du ret i.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester





White paper
Tidsbegrænset kampagne: Overvejer du at udskifte eller tilføje printere i din forretning? Vi kan tilbyde én eller flere maskiner gratis