Avatar billede fiil123 Nybegynder
02. november 2006 - 21:53 Der er 9 kommentarer og
1 løsning

struct som type af en static i en template class

Hej eksperten...
Jeg sidder og roder med dette:

Vektor3.h:

template<int dim, typename Item>
class Vektor3
{
    ...
public:
    ...
private:
    ...
    typedef struct Blok
    {
        Blok *naeste;
    };
    static Blok *heapPtr;       
};

Vektor3.tmpl:
template<int dim, class Item>
Vektor3::Blok *Vektor3<dim, Item>::heapPtr;

Se dette virker ikke og giver mig compile fejl( Microsoft Visual Studio 2005 ):
'Vektor3' : use of class template requires template argument list

Jeg har prøvet:
Vektor3<dim, Item>::::Blok *Vektor3<dim, Item>::heapPtr;

Dette giver fejlene:
'Vektor3<dim,Item>::Blok' : dependent name is not a type
prefix with 'typename' to indicate a type ( dette er en warning )
error C2143: syntax error : missing ';' before '*'
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

Hvordan er den rigtige syntaks?
Avatar billede bertelbrander Praktikant
02. november 2006 - 22:23 #1
Måske:

template<int dim, typename Item>
class Vektor3
{
  Item item[dim];
public:

    struct Blok
    {
        Blok *naeste;
    };
    static Blok *heapPtr;
};

Vektor3<3, int>::Blok *heapPtr;

int main()
{
}
Avatar billede fiil123 Nybegynder
02. november 2006 - 22:25 #2
det skulle jo helst ske i .tmpl filen
Avatar billede bertelbrander Praktikant
02. november 2006 - 22:36 #3
Hvor det sker er vel ikke så vigtigt?
Det skal stå én gang et eller andet sted.
Avatar billede fiil123 Nybegynder
02. november 2006 - 22:39 #4
Da heapPtr bliver anvendt senere i .tmpl filen så vil det være en fordel at have den der plus at det ville give det bedste kode mæssigt opbygning
Avatar billede bertelbrander Praktikant
02. november 2006 - 22:52 #5
Du kan godt bruge heapPtri .tmpl filen uden at den er i .tmpl filen.
Jeg ved ikke af at der findes andre måder.
Avatar billede fiil123 Nybegynder
02. november 2006 - 22:58 #6
Oki men så ville du jo være nødtil både at sige:
Vector<3,int> *V1;
Vektor3<3, int>::Blok *Vektor3<3, int>::heapPtr;
Avatar billede bertelbrander Praktikant
02. november 2006 - 23:50 #7
Nedenstående compilerer med BorlandC++, VisualC++ og Digital Mars, men ikke med min udgave af gcc, forklaringen er vist her:
http://gcc.gnu.org/ml/gcc-bugs/2004-02/msg01358.html

template<int dim, typename Item>
class Vektor3
{
  Item item[dim];
public:

    struct Blok
    {
        Blok *naeste;
    };
    static Blok *heapPtr;
};

template <> Vektor3<3, int>::Blok* Vektor3<3, int>::heapPtr;

int main()
{
  Vektor3<3, int> Vek;
  Vektor3<3, int>::Blok Blok;
  Vek.heapPtr = &Blok;
}
Avatar billede bertelbrander Praktikant
03. november 2006 - 22:28 #8
Hvis jeg bruger:
template <> Vektor3<3, int>::Blok* Vektor3<3, int>::heapPtr = 0;

Kan selv gcc oversætte det. Det virker ikke umiddelbart logisk.
Avatar billede fiil123 Nybegynder
06. november 2006 - 15:15 #9
Hvis du anvender en gammel version af Microsoft Visual Studio skulle det jeg har skrevet compile uden fejl. Dette er faktisk en "fejl" i compileren da den rigtige syntaks er:

template<int dim, class Item>
typename Vektor3<dim, Item>::Blok *Vektor3<dim, Item>::heapPtr;

Så kan det compile i Microsoft Visual Studio 2005 også!
Avatar billede fiil123 Nybegynder
16. januar 2007 - 10:37 #10
Svar ^^
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