PDA

View Full Version : [C++] Classe template ed attributo static


Morfeo XP
13-01-2010, 16:10
Salve

Ho un problema con una classe template con un attributo static di tipo generico.
Riporto una classe d'esempio che presenta lo stesso preoblema.


#ifndef TESTCLASS_H_
#define TESTCLASS_H_

template <class T> class TestClass
{
public:
void setVar(T);
private:
static T var;
};

template<class T> void TestClass<T>::setVar(T v)
{
var = v;
}

#endif




mentre questo è il main:


#include "TestClass.h"

int main()
{
TestClass<int> test;
test.setVar(1);

return 0;
}


La classe TestClass ha un attributo static di tipo generico, ed un metodo (non statico) per impostare l'attributo.

Nel monento in cui compilo il seguente codice (gcc v4.4.1) ottengo il seguente errore "undefined reference to `TestClass<int>::var'" in corrispondenza dell'istruzione "var = v;" del metodo setVar.

Come posso risolvere?

Il problema, credo sia dovuto al fatto che essendo l'attributo var di tipo generico e statico, è condiviso da tutte le istanze della classe. Trattandosi di una classe template, nulla mi vieterebbe di creare una istanza del tipo TestClass<char>, per questo, immagino, il compilatore mi segnala quel errore.

marco.r
13-01-2010, 18:32
Il problema lo avresti anche con una classe non template.
Tu hai solo dichiarato la presenza della variabile statica, ma non l'hai mai definita, e il compilatore non sa dove riservare lo spazio necessario per contenerla.
La presenza dei template aggrava comunque il problema, perche' in questo caso il compilatore non sa neanche per quali tipi riservarlo.

La soluzione e' abbastanza semplice: da qualche parte nel tuo codice definisci la variabile statica con un


template<>
int TestClass<int>::var = 10;

Morfeo XP
13-01-2010, 19:32
Ciao marco.r

Grazie per aver risposto.


template<>
int TestClass<int>::var = 10;


Se inizializzo da qualche parte nel codice della classe l'attributo var come da te indicato, perdo (ammesso che ci sia una soluzione al mio problema) quelli che sono i vantaggi dell'uso dei template.
Nel main ho creato un instanza della classe con parametro di tipo int solo a titolo d'esempio.