PDA

View Full Version : [C++] Template e inclusioni incrociate


Lucio Settimio Severo
05-03-2012, 00:17
Ciao a tutti, mentre stavo lavorando ad un mio progetto mi sono imbattuto in un problema con i template. So che la dichiarazione e l'implementazione di metodi con template andrebbe messa nello stesso file, ma in questo caso le due classi si utilizzano a vicenda e ho ovviamente degli errori causati dal cross-include, mentre se scrivo i metodi nel file cpp associato ho il classico errore del linker. Qualcuno sa come uscirne?
//file Object3D.h
class Object3D
{
...
template <size_t sizeData, size_t sizeIndex>
Object3D(ResourceManager * resourceManager, array<float, sizeData>&data, array<char, sizeIndex>&index)
{
// utilizzo di un oggetto ResourceManager
}
...
};

//file ResourceManager.h
class ResourceManager
{
...
template <size_t sizeData, size_t sizeIndex>
Object3DPtr createObject3DFromArray(array<float, sizeData>&data, array<short, sizeIndex>&index)
{
// utilizzo di un oggetto Object3D
}
...
};

PGI-Bis
05-03-2012, 01:03
Prendilo con le pinze perchè non tocco C++ da prima che Stroustrup lo inventasse ma se non ricordo male l'intoppo si risolve con la dichiarazione dei prototipi delle classe/funzioni che intendi usare. Una cosa del tipo anzichè includere gli header dichiari nel sorgente che usa il tipo X la sua struttura come se fosse una classe a parte e poi il linker o quel che è vista la conformità delle firme provvede a fare i collegamenti giusti.

Ecco, giusto per farfugliarti un'idea.

-MiStO-
05-03-2012, 09:42
Prendilo con le pinze perchè non tocco C++ da prima che Stroustrup lo inventasse ma se non ricordo male l'intoppo si risolve con la dichiarazione dei prototipi delle classe/funzioni che intendi usare. Una cosa del tipo anzichè includere gli header dichiari nel sorgente che usa il tipo X la sua struttura come se fosse una classe a parte e poi il linker o quel che è vista la conformità delle firme provvede a fare i collegamenti giusti.

Ecco, giusto per farfugliarti un'idea.

forward declaration (http://en.wikipedia.org/wiki/Forward_declaration) :)

Lucio Settimio Severo
05-03-2012, 10:58
forward declaration (http://en.wikipedia.org/wiki/Forward_declaration) :)

Ci avevo pensato, ma in questo caso come la applico? perché ho:

template <size_t sizeData, size_t sizeIndex>

come faccio con i size_t a fare una forward declaration?

tomminno
06-03-2012, 13:29
size_t non ha bisogno di forward declaration. Sono le tue classi che ne hanno bisogno.