自定义 CMDIChildWndEx 模板类链接错误

发布于 2024-12-06 22:35:26 字数 2240 浏览 0 评论 0原文

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

Ok, I have defined the template class, which compiles as expected, when I implement this class in a function of the CMainFrame of the application and compile it, I receive unresolved linking errors.

void CMainFrame::OnFunc()
{
    CTestList<CMyClass> list;
}

The linking errors:

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)

I've checked all the obvious missing headers, undefined functions, etc, but still it throws these errors at me, the files are all part of the main application and are not in static/shared libs, as this is the error I would expect if i'd done so..

Here is the basic definition of the template class cut right down, I've followed what I believe to be the correct path in constructing the class, and all my research seems to suggest its correct.

Really need to get this nailed ASAP, so if you guys & girls could help I would be very grateful.

Cheers,
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;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

淡淡の花香 2024-12-13 22:35:26

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

Your template code is not inlined in the header file. When the template class cpp file is being compiled the compiler doesn't know what instances of T will be required. When your main file is being compiled and you need to instantiate a CTestList the compiler only has the template header file. You need to add a force explicite template instantiation to your template .cpp file - so at the moment this is compiled it will generation the correct CMyClass instantiation of the template.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文