wake-up-neo.com

C++ - Vorlage - Mehrere Typen

betrachten Sie die folgende Vorlagenklasse.

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

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

Ich muss eine weitere Funktion MyFunc2 hinzufügen, die ein zusätzliches Template arg T2 Akzeptiert 

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
}

Ich verwende den VS 2008 Compiler. Ich bekomme den Fehler

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

Wie sollte die Funktionsdefinition und -deklaration in diesem Fall aussehen?.

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

EDIT 2:

$ 14.5.2/1 - "Eine Vorlage kann Innerhalb einer Klasse oder Klassenvorlage Deklariert werden; eine solche Vorlage wird als Mitgliedsvorlage bezeichnet. Eine Mitgliedsvorlage kann Innerhalb oder außerhalb ihrer definiert werden Klasse Definition oder Klassenvorlage Definition. Eine Membervorlage einer Klassenvorlage, die außerhalb von ihrer Klassenvorlagendefinition definiert ist, soll mit der Vorlage- angegeben werden. Parameter der Klasse template gefolgt von den template-Parametern der Member template. "

31
Chubsdad

Was Sie tun, ist gut, probieren Sie es aus:

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

Dieser Code funktioniert. Wenn Sie seltsame Fehler erhalten, prüfen Sie, ob Sie forward Structure mit nur einem Vorlagenparameter weiterleiten (das habe ich getan).

23
bobobobo

Probier diese :

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

Dann

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

Ausgabe

Hello World!
dummy 5
0
Hafedh