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

时间:2013-07-24 04:55:58

标签: c++ mfc compilation

我得到了答案,见底。

注意:“_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. 这是微软的一个已知问题“我们不能在RUNTIME_CLASS中使用命名空间”吗?

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

  3. Hans Passant的

    回答

    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 个答案:

答案 0 :(得分:1)

Hans Passant的回答:

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

答案 1 :(得分:0)

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

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