2009-07-04 9 views
0

x__xUn pointeur de fonction qui pointe vers une fonction qui prend un objet d'une classe de modèle avec ledit pointeur de fonction comme argument de modèle. Possible?

Je veux faire quelque chose comme ceci:

typedef long (* fp)(BaseWindow<fp> & wnd, HWND hwnd, long wparam, long lparam); 

Mais je reçois une erreur de compilation:

error C2065: 'fp' : undeclared identifier

Est-il possible de mettre en œuvre ce en quelque sorte?

+0

Typo? Qu'est-ce que fp_t? – eduffy

+0

s'il vous plaît coller la ligne où le compilateur signale l'erreur. – Sahas

+0

woops. Le pointeur s'appelait fp_t mais il n'apparaissait pas dans l'aperçu du post en le tapant, donc je l'ai changé en fp, mais j'ai oublié de modifier le message d'erreur. – Rao

Répondre

9

Non, ce n'est pas le cas, car le type du paramètre de modèle inclurait lui-même. Cela conduirait à une récursivité sans fin dans le type.

Si au lieu de la spécialisation de modèle de classe, vous acceptez une classe de base de celui-ci, qui est très possible

struct TemplateBase { 

}; 

typedef long (*fpType)(TemplateBase&, HWND, long, long); 

template<fpType FP> 
struct BaseWindow : TemplateBase { 

}; 


long sampleFunc(TemplateBase &b, HWND hwnd, long wparam, long lparam) { 
    ... 
} 

int main() { 
    BaseWindow<sampleFunc> bw; 
    sampleFunc(bw, ...); 
} 

Que voulez-vous faire avec ça?

+0

C'était une idée folle pour un problème auquel je suis confronté. Mais peut-être y a-t-il de meilleurs moyens. Il serait trop long d'expliquer le problème comme un commentaire ici, alors peut-être que je poserai une question officielle un peu plus tard. Merci pour la réponse. – Rao

+0

Notez que vous pouvez ajouter des fonctions virtuelles à la classe de base, et les appels provenant de sampleFunc donneront le contrôle à la classe dérivée, comme avec la fonction virtuelle dans les classes non-template. –

Questions connexes