Linker cannot find CFrameWnd::_GetBaseMessageMap
Hello newsgroup,
I'm experiencing a quite strange phenomenon: I have a class derived from
CFrameWnd inside a static library (the following code shows the definition of
the template version; in my code I use CFrameWnd for t_BaseFrameClass). The
reason why I want to use the template is that I want to be able to use the
CHelperMixin class for MDI and SDI projects.
[The following code depends on MFC 4.2. Also you'll have to define _AFXDLL in
order to compile it]
template<class t_BaseFrameClass>
class CHelperMixin: public t_BaseFrameClass
{
typedef t_BaseFrameClass TBaseFrameClass;
protected:
#ifdef _AFXDLL
protected: \
static const AFX_MSGMAP* PASCAL _GetBaseMessageMap();
#endif
protected:
virtual const AFX_MSGMAP* GetMessageMap() const;
};
The follwing code provides the implementation of above message map related methods.
template<class t_BaseFrameClass>
inline const AFX_MSGMAP* PASCAL
CHelperMixin<t_BaseFrameClass>::_GetBaseMessageMap ()
{
return &TBaseFrameClass::messageMap;
}
template<class t_BaseFrameClass>
inline const AFX_MSGMAP* CHelperMixin<t_BaseFrameClass>::GetMessageMap() const
{
// Define an empty message map (just for demonstration).
static const AFX_MSGMAP_ENTRY messageEntries[] =
{
END_MESSAGE_MAP()
static const AFX_MSGMAP messageMap =
{
TBaseFrameClass::_GetBaseMessageMap,
&messageEntries[0]
};
return &messageMap;
}
I use the code like this:
class CMyMainFrame : public CHelperMixin<CFrameWnd>
{
};
Everything compiles fine, but I get a linker error:
error LNK2001: Unresolved external
"protected: static struct AFX_MSGMAP const * __stdcall
CFrameWnd::_GetBaseMessageMap(void)"
Strange enough, if I provide this method in one of my source files, everything
seems to be OK. I wonder how this could happen. Shouldn't the linker complain
about multiple definitions of this method? Surely this method is part of the
static libraries of MFC!
Thanks in advance,
Stuart