【发布时间】:2011-09-27 16:05:50
【问题描述】:
好的,我已经定义了模板类,它可以按预期编译,当我在应用程序的 CMainFrame 的一个函数中实现这个类并编译它时,我收到未解决的链接错误。
void CMainFrame::OnFunc()
{
CTestList<CMyClass> list;
}
链接错误:
1>mainfrm.obj : error LNK2019: unresolved external symbol "public: virtual __thiscall CTestList<class CMyClass>::~CTestList<class CMyClass>(void)" (??1?$CTestList@VCWnd@@@@UAE@XZ) referenced in function "protected: void __thiscall CMainFrame::OnFunc(void)" (?OnFunc@CMainFrame@@IAEXXZ)
1>mainfrm.obj : error LNK2019: unresolved external symbol "public: __thiscall CTestList<class CMyClass>::CTestList<class CMyClass>(void)" (??0?$CTestList@VCWnd@@@@QAE@XZ) referenced in function "protected: void __thiscall CMainFrame::OnFunc(void)" (?OnFunc@CMainFrame@@IAEXXZ)
我检查了所有明显缺失的标头、未定义的函数等,但它仍然向我抛出这些错误,这些文件都是主应用程序的一部分,并且不在静态/共享库中,因为这是错误如果我这样做了,我会期待..
这是模板类的基本定义,我遵循了我认为构建类的正确路径,我所有的研究似乎都表明它是正确的。
真的需要尽快解决这个问题,所以如果你们能提供帮助,我将非常感激。
干杯, 迪吉迪
/////////////////////////////////////////////////////////////////////////////
// CTestList class
template <class T>
class CTestList : public CMDIChildWndEx
{
//DECLARE_DYNAMIC(CTestList<T>)
public:
CTestList();
virtual ~CTestList();
protected:
// Generated message map functions
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
DECLARE_MESSAGE_MAP()
};
/////////////////////////////////////////////////////////////////////////////
// CTestList
//IMPLEMENT_DYNCREATE(CTestList<SDCM_OBJECT_TYPE>, CMDIChildWndEx)
template <class T>
CTestList<T>::CTestList()
{
}
template <class T>
CTestList<T>::~CTestList()
{
}
BEGIN_TEMPLATE_MESSAGE_MAP(CTestList, T, CMDIChildWndEx)
ON_WM_CREATE()
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CTestList message handlers
template <class T>
int CTestList<T>::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if ( CMDIChildWndEx::OnCreate(lpCreateStruct) == -1 )
return -1;
// this removes the crappy un-drawn client edge on screen
ModifyStyleEx(WS_EX_OVERLAPPEDWINDOW, WS_EX_WINDOWEDGE);
return 0;
}
【问题讨论】:
-
你的CMainFrame实现文件是否包含CTestList.h(pp)和CMyClass?
-
@kisplit,必须这样做,否则会出现编译器错误而不是链接器错误。
标签: c++ visual-studio templates mfc