8
votes

Spécialisation partielle de modèle pour le pointeur de fonction __STDCall

1>e:\project\orwell\head\multimapwizard\trunk\externals.cpp(49): error C2079: 't2' uses undefined class 'Externals::TFunction<F>'
1>          with
1>          [
1>              F=Externals::my_function_f2
1>          ]

3 commentaires

__STDCAl : "Sur la famille des processeurs Itanium (IPF) et X64 processeurs, __STDCAll est accepté et ignoré par le compilateur ", que je suppose que c'est pourquoi cela fonctionne 64 bits.


Stackoverflow.com/Questtions/4534907/stdCall-Typef-g-Proble M pourrait aider


@sehe n'est-il pas déjà en train d'utiliser cette syntaxe?


3 Réponses :


4
votes

Ceci est parce que (*) signifie une convention d'appel par défaut, qui est __ CDECL . xxx

est en réalité égale à xxx

qui, bien sûr, ne correspondra pas à un r (__ stdcall *) (t0, t1) sur win32 où __ stdcall n'est pas ignoré. Si vous souhaitez spécialiser partiellement pour les pointeurs de fonction, vous aurez besoin d'une spécification partielle pour chaque convention d'appel que vous souhaitez accepter.


0 commentaires

10
votes

Non, c'est par conception. La convention appelante fait partie intégrante de la déclaration de fonction, la fonction de votre modèle utilise la convention d'appel par défaut. Ce qui n'est pas __stdCall à moins que vous ne compilez avec / gz. La valeur par défaut est / gd, __cdecl.

Le code compile lorsque vous cible x64 car il n'a que blisser une seule convention d'appel.

correction: xxx


0 commentaires

1
votes

Vous n'avez pas spécialisé votre modèle pour l'affaire STDCALL, c'est-à-dire que vous avez besoin

template<class R, class T0, class T1>
class TFunction<R(__stdcall *)(T0,T1)>
{
  typedef R (*func_type)(T0,T1);
};


0 commentaires