2009-09-29 10 views
2

Existe-t-il un moyen d'utiliser IMPLEMENT_DYNCREATE avec une classe de modèle? Si non, pourquoi pas? Y a-t-il une autre solution à cela?MFC IMPLEMENT_DYNCREATE avec le modèle

Exemple:

template<typename T> 
class A : public B{ 
public: 
A(){ printf("A constuctor "); } 
void fn(){ T* a = new T(); } 
}; 

IMPLEMENT_DYNCREATE(A<CObject>, B); 

Répondre

2

OK J'ai pris un coup d'œil sur les macros et un ensemble testé jeté complètement un macro qui peut fonctionner.

#define _RUNTIME_CLASS(class_name, template_name) ((CRuntimeClass*)(&class_name<template_name>::class##class_name##template_name)) 
#define RUNTIME_CLASS(class_name, template_name) _RUNTIME_CLASS(class_name, template_name) 

#define _IMPLEMENT_RUNTIMECLASS(class_name, template_name, base_class_name, wSchema, pfnNew, class_init) \ 
           AFX_COMDAT CRuntimeClass class_name<template_name>::class##class_name##template_name = { \ 
           #class_name, sizeof(class class_name<template_name>), wSchema, pfnNew, \ 
           RUNTIME_CLASS(base_class_name), NULL, class_init }; \ 
           CRuntimeClass* class_name<template_class::GetRuntimeClass() const \ 
           { return RUNTIME_CLASS(class_name, template_name); } 

#define IMPLEMENT_DYNCREATE(class_name, template_name, base_class_name) \ 
          CObject* PASCAL class_name<template_name>::CreateObject() \ 
          { return new class_name<template_name>; } \ 
          IMPLEMENT_RUNTIMECLASS(class_name, template_name, base_class_name, 0xFFFF, \ 
          class_name<template_name>::CreateObject, NULL) 

Ensuite, vous pouvez appeler:

IMPLEMENT_DYNCREATE(A, CObject, B); 

Donnez-lui un essai, comme je le dis, il peut fonctionner: D

0

Fondamentalement Visual Studio 2005 prend en charge la classe d'exécution de modèle, mais Microsoft a pris la macros depuis Visual Studio 2010 (ou 2008).

Solution: copie les macros d'exécution de classe modèle à partir du afx.h de Visual Studio 2005, et un exemple de fichier .h de la vôtre.