infoarena

infoarena - concursuri, probleme, evaluator, articole => Informatica => Subiect creat de: Ieremici Milenco din Ianuarie 09, 2007, 21:41:35



Titlul: Template
Scris de: Ieremici Milenco din Ianuarie 09, 2007, 21:41:35
Buna!

Nu am gasit search asa ca daca mai exista un subiect pe aceasta tema imi cer scuze.

Vreau sa imi fac un template pentru o lista. In template am declarat un pointer static dar nu stiu de ce cand il declar imi da eroare. Am sa dau si un exemplu ca poate nu m-am exprimat cum trebuie:

template <typename T> class Lista
{
      static Lista *head;
      Lista *next;
public:
...
};

class XXX
{
...
};

Lista<XXX> *Lista<XXX> :: head = NULL;

Eroarea care o primesc este: "too few template-parameter-lists "


P.S. Exista cumva vrea diferenta intre declaratia <typename T> si <class T> sau e mai bine una sa o folosesti candva si pe cealalta altcandva?


Mersi anticipat de ajutor


Titlul: Raspuns: Template
Scris de: Bondane Cosmin din Ianuarie 09, 2007, 22:09:57
nu exista nici o diferenta intre <typename T> si <class T>, doar ca <typename T> ii 'notatia' mai noua. cam atata te pot ajuta. nu stiu dc nu iti merge codu, sorry.


Titlul: Raspuns: Template
Scris de: Stefan-Alexandru Filip din Ianuarie 10, 2007, 16:58:55
Dubios.

Am cautat putin pe net dar nu am inteles exact cum functioneaza variabilele statice ale unei clase template in C++.
Problema este momentul in care este creata variabila statica. Pe langa asta si declararea este neclara, desi are sens din punct de vedere sintactic al C++.
In orice caz, tu trebuie sa scrii:
Cod:
template <typename T> Lista <T> *Lista <T> :: head = NULL;

Ceea ce nu inteleg este cum o sa te ajute variabila statica.
Variabila statica este aceiasi pentru toate clasele de acelasi fel, iar in clasa ta cam pierzi capul listei.
Cod:
#include <cstdio>

template <typename T> class Lista {
public:
static Lista<T> *head ;
};

template <typename T> Lista<T> *Lista<T>::head = NULL;

int main() {
Lista <int> A, B, C;

A.head = &B;
C.head = &A;
B.head = &C;

D.head = &E;
E.head = &D;

        // Afiseaza adresele fiecarei clase
printf("%p %p %p\n", &A, &B, &C);

        // Afiseaza aceiasi valoare, adresa clasei C
printf("%p %p %p\n", A.head, B.head, C.head);

printf("%p %p\n", &D, &E);

printf("%p %p\n", D.head, E.head);


return 0;
}