如果 MFC RUNTIME_CLASS 参数具有命名空间,则编译器错误

Posted

技术标签:

【中文标题】如果 MFC RUNTIME_CLASS 参数具有命名空间,则编译器错误【英文标题】:compiler error if MFC RUNTIME_CLASS argument has namespace 【发布时间】:2013-07-24 04:55:58 【问题描述】:

我有答案,见底部。

注意:“_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)

现在我的问题是:

    这是来自微软的已知问题“我们不能在 RUNTIME_CLASS 中使用命名空间”吗?

    一个更实际的问题:由于某种原因(例如来自不同命名空间的类冲突),我们不能在 cpp 文件中“使用命名空间”,如何在 MFC 中使用运行时类型标识?

    李>

汉斯·帕桑特的回答

Microsoft 已确认此错误here。

解决方法很聪明,我在这里复制了它:

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 已定义和未定义)。

【问题讨论】:

CMyClass 真的在MyNamespace 中吗?如果是,为什么不在代码中显示出来? @juanchopanza 是的,是的。修改了代码 可能不是原因,但在 MyClass.h 中的“命名空间 MyNameSpace”之前是否缺少“”。 @MichaelWalz 这只是一个错字,已更正,问题仍然存在。 connect.microsoft.com/VisualStudio/feedback/details/180980/… 【参考方案1】:

汉斯·帕桑特的回答:

Microsoft 已在此处确认此错误。

解决方法很聪明,我复制了here:

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 已定义和未定义)。

【讨论】:

【参考方案2】:

MFC宏可以被限制,用dynamic_cast代替IsKindOf(RUNTIME_CLASS(class_name))怎么样?

CMyBase* pObject =dynamic_cast<MyNameSpace::CMyClass>(new MyNameSpace::CMyClass);

【讨论】:

以上是关于如果 MFC RUNTIME_CLASS 参数具有命名空间,则编译器错误的主要内容,如果未能解决你的问题,请参考以下文章

MFC常用的类详细介绍

MFC 窗口分割(拆分)问题

ontimer 与多线程

手动创建CView视图

Windows下多线程编程

Windows下多线程编程