web-dev-qa-db-fra.com

Modèle C++ - Plusieurs types

considérons la classe de modèle suivante.

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

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

Je dois ajouter une autre fonction MyFunc2 qui accepte un Modèle arg T2 .__ supplémentaire. 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. Je reçois l'erreur

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

À quoi devrait ressembler la définition et la déclaration des fonctions dans ce cas?.

29
SysAdmin
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 une classe ou un modèle de 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 son class definition ou modèle de classe definition. Un modèle de membre d'un modèle de classe défini en dehors de de sa définition de modèle de classe doit être spécifié avec le template. paramètres de la classe template suivis des template-parameters du membre template. "

31
Chubsdad

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, voyez si vous faites suivre Structure en utilisant un seul paramètre de modèle (c'est ce que je faisais).

23
bobobobo

Essaye celui-là :

template <class T, class T2>
class MyClass
{
public:
    static void MyFunc2(T2* data);
};

template <class T, class T2>
void MyClass<T, T2>::MyFunc2(T2* pData)
{
    cout << "dummy " << *pData<< "\n";
}

Ensuite

int main()
{
    cout << "Hello World!\n"; 
    MyClass<int, int> a;
    int *b = (int*)malloc(sizeof(int));
    *b = 5;
    a.MyFunc2(b);
}

Sortie

Hello World!
dummy 5
0
Hafedh