私は答えを持っています、下を見てください。
注: "_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 で名前空間を使用できない」という Microsoft の既知の問題ですか?
より実用的な質問: 何らかの理由 (たとえば、異なる名前空間の競合からのクラス) で、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 が定義されているものと定義されていないもの) で機能します。