error C2955: “CTemplateList”: 使用类 模板 需要 模板 参数列表
#pragma once
// CTemplateList
template<class T1, class T2>
class CTemplateList : public CListCtrl
{
DECLARE_DYNAMIC(CTemplateList)public:
CTemplateList();
virtual ~CTemplateList();protected:
DECLARE_MESSAGE_MAP()public:
T1 m_t1;
T2 m_t2;
};
// TemplateList.cpp : 实现文件
//#include "stdafx.h"
#include "TplList.h"
#include "TemplateList.h"
// CTemplateListIMPLEMENT_DYNAMIC(CTemplateList, CListCtrl)   //这个地方报错CTemplateList::CTemplateList()
{}CTemplateList::~CTemplateList()
{
}
BEGIN_MESSAGE_MAP(CTemplateList, CListCtrl)   //这个地方报错
END_MESSAGE_MAP()// CTemplateList 消息处理程序

解决方案 »

  1.   

    模板的写法,非常复杂,C++ Primer 上有例子.我查了一下,成员函数写法如下
    template<class T1,class T2> CListTemplate<T1,T2>::CListTemplate()
    {
    }BEGIN_MESSAGE_MAP END_MESSAGE_MAP
    定义的是宏,里面是函数与数组的定义.要按照上面的格式写.由于模板的写法复杂,我找不到把模板写进这个消息映射的宏里的方法,只好自己重写了一下.
    //这些内容相当于BEGIN_MESSAGE_MAP
    template<class T1,class T2> const AFX_MSGMAP* CListTemplate<T1,T2>::GetMessageMap() const
    {return &CListTemplate<T1,T2>::messageMap;}
    template<class T1,class T2> AFX_COMDAT AFX_DATADEF const AFX_MSGMAP 
    CListTemplate<T1,T2>::messageMap = 
    { &CListTemplate::messageMap, &CListTemplate::_messageEntries[0] };template<class T1,class T2> AFX_COMDAT const AFX_MSGMAP_ENTRY CListTemplate<T1,T2>::_messageEntries[] = 
    {
    //{{AFX_MSG_MAP(CListTemplate)
    // NOTE - the ClassWizard will add and remove mapping macros here.
    //中间加消息映射 //}}AFX_MSG_MAP//下面的内容相当于END_MESSAGE_MAP
    {0, 0, 0, 0, AfxSig_end, (AFX_PMSG)0 }
    };
      

  2.   

    楼主,我也很头大,当我添加一个模板变量实例的时候,报错,说找不到构造函数与释构函数的实现,又看了一下书.说模板,在使用的时候,要完全知道该模板的实现,不可以只有头文件,如果是分开h文件与cpp文件定义的模板,要在h文件下面加上 #include XXXX.cpp 才可以.
    然后我又照着做,再把 xxxx.cpp 上面的 static char THIS_FILE[] = __FILE__; 变量定义删掉.
    编译又成功了一些,但又报另外的错误,说我在MESSAGE_MAP的写法有误. 
    cannot convert from 'const struct AFX_MSGMAP *' to 'const struct AFX_MSGMAP *(__stdcall *)(void)'
    现在还没查到写错了哪些.错是出在这里
    CListTemplate<T1,T2>::messageMap = 
    { &CListTemplate::messageMap, &CListTemplate::_messageEntries[0] };
    我一开始是写错了,但我现在改成这样.
    template<class T1,class T2> AFX_COMDAT AFX_DATADEF const AFX_MSGMAP 
    CListTemplate<T1,T2>::messageMap = 
    { &CListCtrl::messageMap, &CListTemplate<T1,T2>::_messageEntries[0] };
    仍然是报那个错误.
      

  3.   

    我搜了一下,看到有人说可以用runtimeclass替代模板,不过不知道怎么用。这种情况下用模板可能不太好
      

  4.   

    要使用List的虚列表功能,里面保存行的数据结构,因为几个list的结构体不同,所以想写成模板类。另外,每一行都有一个标识(可能是int、double、CString等),会用到这个标识来找对应的行号(用map做映射)以后可能要重载SetItemData、GetItemData、SetItemText等常函数
      

  5.   

    你以后自己重写或加入的函数,也可以用你的模板数据结构来做参数.就像用STL里的一样.
      

  6.   

    方便重用,因为几个地方都要用到这样的list,而每个list的行的内容又不同,写成模板的话就不用为每个list分别写一个版本了
      

  7.   


    template<class T1,class T2> const AFX_MSGMAP* PASCAL 
    CListTemplate<T1,T2>::_GetBaseMessageMap()
    {
    return &CListCtrl::messageMap;
    }template<class T1,class T2> const AFX_MSGMAP* 
    CListTemplate<T1,T2>::GetMessageMap() const
    {
    return &CListTemplate<T1,T2>::messageMap;
    }template<class T1,class T2> AFX_COMDAT AFX_DATADEF const AFX_MSGMAP 
    CListTemplate<T1,T2>::messageMap = {
    &CListTemplate<T1,T2>::_GetBaseMessageMap,
    &CListTemplate<T1,T2>::_messageEntries[0]
    };template<class T1,class T2> AFX_COMDAT const AFX_MSGMAP_ENTRY
    CListTemplate<T1,T2>::_messageEntries[] = 
    {
    //{{AFX_MSG_MAP(CListTemplate)
    // NOTE - the ClassWizard will add and remove mapping macros here.
    //中间加消息映射

    //}}AFX_MSG_MAP

    //下面的内容相当于END_MESSAGE_MAP
    {0, 0, 0, 0, AfxSig_end, (AFX_PMSG)0 },
    };
    终于写好了,原来之前是抄错了BEGIN_MESSAGE_BOX的宏定义,赋值处出错了.
    楼主,留个QQ,传个工程给你试试吧.你的意思是不是,你写的这个List模板,不是在一个程序上用的,可能是很多个程序,每个都有自己的特别的数据的,所以要搞模板?
      

  8.   

    对,list要用到不同的地方411973115#qq.com发到qq邮箱里吧,谢啦。