2010-10-21 6 views
23

considérez la classe de modèle suivante.Modèle C++ - Plusieurs types

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

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

je dois ajouter une autre fonction ma_fonction2 qui accepte un supplémentaire modèle arg T2 i.e.

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 
} 

J'utilise le compilateur VS 2008. J'obtiens l'erreur

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

Comment devrait ressembler la définition et la déclaration des fonctions dans ce cas.

+2

Plus souvent qu'autrement, il est plus facile de définir les fonctions de membre de modèle inline dans la définition de modèle de classe pour éviter tous ces petits problèmes –

Répondre

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

EDIT 2:

14.5.2 $/1 - « Un modèle peut être déclaré dans un modèle de classe ou classe , un tel modèle est appelé un modèle de membre Un modèle de membre. peut être défini à l'intérieur ou à l'extérieur de sa classe définition ou modèle de classe définition Un modèle de membre d'un modèle de classe défini en dehors de de son modèle de classe finition doit être être spécifié avec les paramètres de modèle du modèle de classe suivi des paramètres de modèle du modèle membre . "

+0

J'ai toujours trouvé cette syntaxe awkw ard, il ne s'améliore pas avec les classes imbriquées ... –

+0

@ Chubsdad: que diriez-vous du mot-clé statique dans la déclaration originale de fonction de membre modèle? Est-il valable de l'abandonner dans la mise en œuvre? –

18

Ce que vous faites est bien, essayez ceci:

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; 
} 

Ce code fonctionne Si vous obtenez des erreurs étranges, voir si vous avantStructure à l'aide déclarée seulement 1. paramètre de modèle (c'est ce que je faisais)

Questions connexes