1

私は答えを持っています、下を見てください。

注: "_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 で名前空間を使用できない」という Microsoft の既知の問題ですか?

  2. より実用的な質問: 何らかの理由 (たとえば、異なる名前空間の競合からのクラス) で、cpp ファイルで「名前空間を使用する」ことはできません。MFC でランタイム型識別を使用するにはどうすればよいですか?

Hans Passant からの回答:

Microsoft は、このバグをここで確認しています。

回避策は非常にスマートです。ここにコピーしました:

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 が定義されているものと定義されていないもの) で機能します。

4

2 に答える 2

1

Hans Passant からの回答:

Microsoft はこのバグをここで確認しています。

回避策は非常にスマートです。ここにコピーしました:

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 が定義されているものと定義されていないもの) で機能します。

于 2013-07-24T22:56:40.300 に答える
0

MFC マクロは制限できますが、IsKindOf(RUNTIME_CLASS(class_name)) の代わりに dynamic_cast を使用するのはどうですか?

CMyBase* pObject =dynamic_cast<MyNameSpace::CMyClass>(new MyNameSpace::CMyClass);
于 2013-07-24T09:37:08.770 に答える