2010-10-21 14 views
23

considerare la seguente classe modello.Modello C++ - Tipi multipli

template <class T> 
class MyClass 
{ 
    void MyFunc(); 
} 

template <class T> 
void MyClass<T>::MyFunc() 
{ 
    //...implementation goes here 
} 

ho bisogno di aggiungere un'altra funzione MyFunc2 che accetta un ulteriore Template arg T2 cioè

template <class T> 
class MyClass 
{ 
    void MyFunc(); 

    template <class T2> 
    static void MyFunc2(T2* data); 
} 

template <class T> 
void MyClass<T>::MyFunc() 
{ 
    //...implementation goes here 
} 

template <class T, class T2> 
void MyClass<T>::MyFunc2(T2* pData) 
{ 
    //...implementation goes here 
} 

Sto usando il compilatore VS 2008. Ricevo l'errore

error C2244: unable to match function definition to an existing declaration 

Come deve apparire la definizione e la dichiarazione delle funzioni in questo caso.

+2

Molto spesso, è più facile definire le funzioni membro del modello inline nella definizione del modello di classe per evitare tutti questi piccoli problemi. –

risposta

24
template <class T> 
template <class T2> 
void MyClass<T>::MyFunc2(T2* pData) 
{ 
    //...implementation goes here 
} 

EDIT 2:

$ 14.5.2/1 - "Un modello può essere dichiarata all'interno di una classe o di classe template, tale modello si chiama un modello membro Un modello di membro. può essere definito all'interno o all'esterno della sua classe definizione o modello di classe definizione. Un modello membro di un modello di classe definito all'esterno dello modello di classe de specificare con i parametri modello del modello classe seguito dai parametri modello del modello membro . "

+0

Ho sempre trovato questa sintassi awkw ard, non migliora con le classi annidate ... –

+0

@Chubsdad: che ne dici della parola chiave statica nella dichiarazione della funzione membro modello originale? È valido rinunciare all'implementazione? –

18

Quello che stai facendo è bene, provare questo fuori:

template <typename S,typename T> 
struct Structure 
{ 
    S s ; 
    T t ; 

} ; 

int main(int argc, const char * argv[]) 
{ 
    Structure<int,double> ss ; 
    ss.s = 200 ; 
    ss.t = 5.4 ; 

    return 1; 
} 

questo codice funziona Se stai ricevendo strani errori, vedere se si avanti dichiaratoStructure solo 1 utilizzando. parametro template (è quello che stavo facendo)