error C2953: 类模板已经定义

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了error C2953: 类模板已经定义相关的知识,希望对你有一定的参考价值。

error C2953: 类模板已经定义

我没有从定义 怎么会出这个错误

说明类模板已经定义。应该是你在头文件里已经定义了,请注意有没有声明的方法后面有。
另外注意:模板函数只能放在头文件中。不需要放到.cpp/.c文件中。
参考技术A 使用过一些什么类?stl里很多都是用模板来设计的。 参考技术B 应该是重复include了 参考技术C 抱歉暂无数据!

自定义 CMDIChildWndEx 模板类链接错误

【中文标题】自定义 CMDIChildWndEx 模板类链接错误【英文标题】:Custom CMDIChildWndEx template class linking errors 【发布时间】: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,必须这样做,否则会出现编译器错误而不是链接器错误。 【参考方案1】:

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

【讨论】:

正确,现在完全理解了,感谢您的帮助 Ricibob :)

以上是关于error C2953: 类模板已经定义的主要内容,如果未能解决你的问题,请参考以下文章

自定义 CMDIChildWndEx 模板类链接错误

模板类的链接器错误

18.2.2 简单的类模板

在C++的模板类中创建向量

在我的模板类示例中,即使我没有定义添加方法,它也会添加“分段错误(核心转储)”错误

如何以模板类作为模板参数在模板类中正确定义模板函数