2013-05-09 28 views
7

Ho il seguente modello nidificatoQual è la sintassi legale per definire il modello annidato?

class A { 
    template <typename T> class B { 
     template <typename U> void foo(U arg); 
    }; 
}; 

sto cercando di definire il modello nidificato in questo modo:

template <typename T, typename U> void 
A::B<T>::foo(U arg) {...} 

Ma sto ottenendo declaration is incompatible with function template errore. Qual è la sintassi legale per farlo?

+3

È quasi potrebbe anche solo definirlo proprio lì. Non può andare in un file separato. – chris

+2

@chris: solo perché non può essere in un'unità di traduzione separata non significa che non può essere in un file diverso. Anche se doveva essere nello stesso file, puoi comunque separare l'implementazione dall'interfaccia. –

+0

@MooingDuck, True, files! = TU. Stavo pensando più alla definizione di definirlo genericamente in un file collegato. E io, personalmente, mi piace definire i modelli al di fuori della definizione della classe, motivo per cui ho detto quasi. Ho pensato che l'OP sarebbe andato per il primo punto, dove fallirà. – chris

risposta

10

è necessario separare le dichiarazioni del modello:

template <typename T> 
template <typename U> 
void 
A::B<T>::foo(U arg) { … } 
+0

L'ho provato ma non sembra funzionare - il compilatore sembra confondere 'T' con' U'. Io chiamo 'arg.UMember()' in 'foo', ma il compilatore si lamenta' A :: B non ha un membro UMember' – mchen

+0

parentesi vuote che chiamano costruttori predefiniti invece di costruttori inizializzatore-elenco e questo. Oggi è un giorno eccezionale per l'apprendimento. – chris

+0

@MiloChen: http://coliru.stacked-crooked.com/view?id=4db49730dd7df44b6f01839277cc6c4f-50d9cfc8a1d350e7409e81e87c2653ba. Hai il modello 'T' prima del modello' U'? [Devono essere nel giusto ordine.] (Http://coliru.stacked-crooked.com/view?id=0b98f6449a84341a2111b33f48a3536e-50d9cfc8a1d350e7409e81e87c2653ba) –

Problemi correlati