Domanda

Il C++ sembra essere piuttosto scontroso quando si dichiarano modelli su più file.Più specificamente, quando si lavora con classi basate su modelli, il linker prevede che tutte le definizioni dei metodi per la classe siano in un singolo file oggetto del compilatore.Quando prendi in considerazione le intestazioni, altre dichiarazioni, l'ereditarietà, ecc., le cose diventano davvero confuse.

Sono disponibili consigli generali o soluzioni alternative per organizzare o ridistribuire le definizioni dei membri basati su modelli su più file?

È stato utile?

Soluzione

Sono disponibili consigli generali o soluzioni alternative per organizzare o ridistribuire le definizioni dei membri basati su modelli su più file?

SÌ;non.

La specifica C++ consente a un compilatore di essere in grado di "vedere" l'intero modello (declaration E definizione) al momento dell'istanziazione e (a causa della complessità di qualsiasi implementazione) la maggior parte dei compilatori mantiene questo requisito.Il risultato è che l'inclusione di qualsiasi intestazione del modello deve includere anche tutte le fonti richieste per creare un'istanza del modello.

Il modo più semplice per gestire questo problema è scaricare tutto nell'intestazione, in linea dove possibile, fuori linea dove necessario.

Se lo consideri davvero un affronto inaccettabile, un'opzione comune è dividere il modello nella solita coppia intestazione/implementazione e quindi #includere il file di implementazione alla fine dell'intestazione.

La funzionalità di "esportazione" di C++ può o meno fornire un'altra soluzione alternativa.La funzionalità è scarsamente supportata e scarsamente definita;sebbene in linea di principio dovrebbe consentire una sorta di compilazione separata dei modelli, non elimina necessariamente la richiesta che il compilatore sia in grado di vedere l'intero corpo del modello.

Altri suggerimenti

Su quanti file?Se vuoi semplicemente separare le definizioni di classe dall'implementazione, prova Questo articolo nelle domande frequenti su C++.Questo è l'unico modo che conosco per funzionare al momento, ma alcuni IDE (ad esempio Eclipse CDT) non collegheranno correttamente questo metodo e potresti ricevere molti errori.Tuttavia scrivere i propri makefile o utilizzare Visual C++ ha sempre funzionato per me :-)

Quando/se il tuo compilatore supporta C++0x, il file extern La parola chiave può essere utilizzata per separare le dichiarazioni del modello dalle definizioni.

Vedere Qui per una breve spiegazione.

Inoltre, la sezione 6.3, "Il modello di separazione", di Modelli C++:La guida completa di David Vandevoorde e Nicolai M.Josuttis descrive altre opzioni.

alt text

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top