2009-09-29 46 views
2

有什麼方法可以使用IMPLEMENT_DYNCREATE和模板類?如果不是,爲什麼不呢?還有其他解決方案嗎?MFC IMPLEMENT_DYNCREATE with template

例子:

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

IMPLEMENT_DYNCREATE(A<CObject>, B); 

回答

2

好吧,我已經採取了快速瀏覽一下宏和一起引發一個完全未測試的宏,可能工作。

#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) 

然後,您可以撥打:

IMPLEMENT_DYNCREATE(A, CObject, B); 

試試看吧,就像我說的,它可能工作:d

0

基本的Visual Studio 2005支持模板運行時類,但微軟採取了宏自Visual Studio 2010(或2008)以來。

解決方案:將模板類運行時宏從Visual Studio 2005的afx.h中複製出來,並製作您的.h文件。

相關問題