自定义CMDIChildWndEx模板类链接错误

时间:2011-09-27 16:05:51

标签: c++ visual-studio templates mfc

好的,我定义了模板类,它按预期编译,当我在应用程序的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)

我已经检查了所有明显丢失的标题,未定义的函数等,但它仍然向我抛出这些错误,文件都是主应用程序的一部分而不是静态/共享库,因为这是错误如果我这样做,我会期待......

以下是模板类的基本定义,我遵循了我认为构建类的正确路径,我所有的研究似乎都表明它是正确的。

真的需要尽快得到这个,所以如果你们和他们一样女孩们可以帮助我,我将非常感激。

干杯, DIGGIDY

/////////////////////////////////////////////////////////////////////////////
// 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;
}

1 个答案:

答案 0 :(得分:0)

您的模板代码未在标头文件中内联。在编译模板类cpp文件时,编译器不知道将需要哪些T实例。在编译主文件并且需要实例化CTestList时,编译器只有模板头文件。您需要在模板.cpp文件中添加一个强制explicite模板实例化 - 所以在编译它时,它将生成模板的正确CMyClass实例化。