2012-04-18 16 views
10

O.K. definire la funzione virtuale del modello di classe al di fuori del suo corpo? La funzione virtuale non può essere sottolineata, ma per evitare definizioni multiple in unità di compilazione, devono essere contrassegnate con inline (presupponendo che le intestazioni di modello siano incluse in più file sorgente). D'altra parte il compilatore è libero di ignorare inline, quindi questo sembra valido. Per un esempio, il seguente codice è corretto:Definizioni di modelli al di fuori del corpo della classe

template <typename T> 
class C 
{ 
public: 
    virtual void f(T val); 
}; 

template <typename T> 
inline 
void C<T>::f(T val) 
{ 
    //definition 
} 

?

BTW gcc (3.4.2) consente di omettere inline prima della definizione della funzione f(T val) ma non prima della funzione analoga della classe regolare. È solo il comportamento di gcc?

+5

Si utilizza gcc * 3.4.2 *? – jpalecek

+0

@jpalecek in questo particolare esempio, sì. – doc

+1

@doc - Le funzioni virtuali * possono * essere dichiarate 'inline' (ma non è necessario qui). Il compilatore ha solo un po 'più difficile capire esattamente quando le funzioni possono essere sottolineate. –

risposta

10

Sì, va bene anche senza inline funziona lo stesso per le funzioni di membro ordinarie e variabili statiche:

// everything in the header: 
template <class T> 
class A 
{ 
    static int i; 
}; 

template <class T> 
int A<T>::i=0; 

citazione standard: (3,2/5)

Non ci può essere mor e di una definizione di un tipo di classe (clausola 9), tipo di enumerazione (7.2), funzione inline con collegamento esterno (7.1.2), modello di classe (clausola 14), modello di funzione non statico (14.5.6), statico membro dati di un modello di classe (14.5.1.3), funzione membro di un modello di classe (14.5.1.1) o specializzazione modello per che alcuni parametri modello non sono stati specificati (14.7, 14.5.5) in un programma fornito che ciascuno de definizione appare in un'unità di traduzione di ff erenti, e purché le definizioni de fi soddisfano i seguenti requisiti ...

i requisiti fondamentalmente dire i due definizioni devono essere identici.

Non funziona in caso di classi regolari. Ci deve essere al massimo una definizione nell'intero programma.

+0

Perché qualcuno ha votato questa risposta:? – doc

3

È possibile definire le funzioni lì, purché qualsiasi codice che ha bisogno di istanziare la funzione in questione abbia visibilità di quel codice in fase di compilazione (non tempo di collegamento).

È piuttosto comune separare un modello in 2 file, uno è un'intestazione tradizionale e il secondo è l'implementazione, come nel caso delle funzioni non basate su modelli e della loro implementazione. L'unica differenza è che è necessario includere il file di implementazione del modello e l'intestazione quando si desidera utilizzarlo.

4

È possibile definire metodi di modello al di fuori della definizione class, nella stessa intestazione, senza utilizzare inline e senza ricevere più errori di definizione.

Questo perché una funzione modello non genera una definizione stessa, se non è completamente specializzata. Per dimostrare il mio punto, il seguente:

void C<int>::f(int) 
{ 
} 

si tradurrà in un errore di linker, come la funzione ha una definizione in questo caso. (A condizione di includere questo in più unità di traduzione Se si contrassegna in linea:...

inline void C<int>::f(int) 
{ 
} 

l'errore non si verifica

Problemi correlati