2010-03-08 10 views
7

È consigliabile includere protezioni attorno alle classi di modelli?Classi di modelli e protezioni incluse in C++

Le classi template non devono essere ripetute ogni volta che le si fa riferimento con un'implementazione diversa?

NB In Visual C++ 2008 ottengo errori che conciliano i due ...

risposta

8

modelli definizioni dovrebbero essere analizzati una volta (e le cose come due fasi di ricerca del nome sono qui in modo che quanto più gli errori possibili possono essere dato immediatamente senza avere un'istanza). Le istanziazioni sono fatte usando la struttura interna dei dati costruita in quel momento.

Le definizioni dei modelli sono in genere (ad esempio se non si utilizza export o si fa qualcosa di speciale) nei file di intestazione che dovrebbero avere la protezione di inclusione. L'aggiunta di uno per la definizione del modello è inutile ma non dannosa.

+5

Aggiungo sempre guardie sempre, ci si abitua, dato che è una BUONA pratica. – Poni

+1

Se fai qualche sviluppo su win32, includi '#pragma once' ogni volta che usi le guardie incluse. – KitsuneYMG

+0

+1 per affermare che le istanze vengono eseguite utilizzando la struttura dati interna creata al momento della prima scansione – Otuken

12

È necessario includere protezioni. Considerate questo codice:

// this is t.h 
template <typename T> 
void f(T t) { 
} 

// this is t.cpp 
#include "t.h" 
#include "t.h" 

int main() { 
    f(1); 
} 

Questo dà l'errore:

t.h:2: error: redefinition of 'template<class T> void f(T)' 
t.h:2: error: 'template<class T> void f(T)' previously declared here 

Inoltre, le intestazioni che contengono i modelli di routine anche contenere codice non-modello.

+2

Strettamente quella è una funzione modello piuttosto che una classe modello, ma il principio è lo stesso - si ottiene un errore di definizione multipla se si dichiara stessa classe due volte, modello o no. –

+0

Vedere la mia risposta qui - http://stackoverflow.com/questions/22595015/c-class-template-undefined-reference-to-function/26816994#26816994 – v010dya

2

Risposta breve: ogni unità che si intende includere più di una volta con qualsiasi definizione dovrebbe avere una protezione dell'intestazione. Questo è con o senza modelli.

2

Per rispondere alla prima domanda: Sì, è saggio e obbligatorio includere le protezioni attorno alle classi di modelli. O più strettamente circostante l'intero contenuto di ogni file di intestazione.

Questo è il modo per obbedire alla regola di una definizione quando si dispone di elementi nei file di intestazione, in modo che siano condivisi e comunque sicuri. Potrebbero esserci altri file di intestazione che includono il tuo. Quando il compilatore compila un file di modulo, potrebbe vedere un numero #include del tuo file di intestazione molte volte, ma le guardie eseguono il kick-in nella seconda e nelle successive volte per assicurarsi che il compilatore visualizzi solo il contenuto una volta.

Non importa che il compilatore ritorni a qualcosa; questo è il suo lavoro. Devi solo fornire i contenuti una volta e poi il compilatore l'ha visto e può fare riferimento ad esso tutte le volte che ha bisogno.