c++ - 编译器错误如果 MFC RUNTIME_CLASS参数具有命名空间

  显示原文与译文双语对照的内容
0 0

我有答案,请看下面。

注意:对于我的例子,"_afxdll"没有预定义,静态链接到 MFC 。

我有这样的代码:

MyClass.h

namespace MyNameSpace
{
 class CMyClass : public CMyBase
 {
 DECLARE_DYNAMIC( CMyClass )
. . .
 }
}

MyClass.cpp

using namespace MyNameSpace;
IMPLEMENT_DYNAMIC( CMyClass, CMyBase)

来电者

CMyBase* pObject = new MyNameSpace::CMyClass();
....
pObject->IsKindOf(RUNTIME_CLASS(MyNameSpace::CMyClass))

编译时,出现错误:

error C3083: 'classMyNameSpace': the symbol to the left of a '::' must be a type
error C2277: 'MyNameSpace::CMyClass::{ctor}' : cannot take address of this member function

我调查了宏 RUNTIME_CLASS,发现它最终扩展到:

#define RUNTIME_CLASS(class_name) _RUNTIME_CLASS(class_name)
#define _RUNTIME_CLASS(class_name) ((CRuntimeClass*)(&class_name::class##class_name))
(CRuntimeClass*)(&MyNameSpace::CMyClass::classMyNameSpace::CMyClass)

如果它可以扩展到下面的代码,那么所有好的。

(CRuntimeClass*)(&MyNameSpace::CMyClass::classCMyClass)

现在我的问题是:

  1. 这是微软的一个已知问题?

  2. 更实际的问题:由于某些原因( 比如 。 不能在不同的命名空间冲突中,我们不能在dwr文件中使用运行时类型标识。

Hans 。Passant的回答:

微软已经在这里确认了这个 Bug

我在这里复制了这个解决方法,

Posted by BongoVR on 8/15/2006 at 2:39 AM
define YET ANOTHER MACRO and use it instead of RUNTIME_CLASS when namespace-qualified class names are to be used in the code:
#ifdef _AFXDLL
#define RUNTIME_CLASS_N(n, class_name) (n::class_name::GetThisClass())
#else
#define RUNTIME_CLASS_N(n, class_name) ((CRuntimeClass*)(&n::class_name::class##class_name))
#endif

这里宏在两个生成( 定义了 _AFXDLL,但未定义) 中都有效。

时间:原作者:7个回答

0 0

汉斯。Passant的回答:

Microsoft已经在这里确认这里 Bug 。

解决方法相当聪明,我在这里复制了 :

Posted by BongoVR on 8/15/2006 at 2:39 AM
define YET ANOTHER MACRO and use it instead of RUNTIME_CLASS when namespace-qualified class names are to be used in the code:
#ifdef _AFXDLL
#define RUNTIME_CLASS_N(n, class_name) (n::class_name::GetThisClass())
#else
#define RUNTIME_CLASS_N(n, class_name) ((CRuntimeClass*)(&n::class_name::class##class_name))
#endif

这里宏在两个生成( 定义了 _AFXDLL,但未定义) 中都有效。

原作者:
0 0

可以限制MFC宏,如何使用dynamic_cast而不是 IsKindOf ( RUNTIME_CLASS ( class_name )?

CMyBase* pObject =dynamic_cast<MyNameSpace::CMyClass>(new MyNameSpace::CMyClass);
原作者:
...