Здравствуйте!
При работе с WTl обратил внимание, что объявления и реализации методов параметризованных классов находятся в H-файлах.
Пишу свой грид на основе CListViewCtrl
template <class T, class TBase /* = CWindow */, class TWinTraits = CMySimpleGridListTraits >
class CMySimpleGridCtrlImpl : public CWindowImpl<T, TBase, TWinTraits>,
public CCustomDraw< CMySimpleGridCtrlImpl <T, TBase, TWinTraits > >,
public CMessageFilter
{
typedef CMySimpleGridCtrlImpl< T, TBase, TWinTraits > thisClass;
typedef CWindowImpl< T, TBase, TWinTraits > baseListViewCtrlClass;
// Construction
public:
DECLARE_WND_SUPERCLASS(NULL, WC_LISTVIEW)
и т.д.
реализацию методы соотвественно в CPP-файле
template <class T, class TBase /* = CWindow */, class TWinTraits /* = CMySimpleGridListTraits*/ >
LRESULT CMySimpleGridCtrlImpl< T, TBase, TWinTraits >::OnInsertColumn(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
if(!m_bHorizontal)
{
if(static_cast<int>(wParam) >= this->GetColumnsCount())
{
CListColumn newColumn(static_cast<int>(wParam), reinterpret_cast<LPLVCOLUMN>(lParam));
m_Columns.push_back(newColumn);
bHandled = false;
}
else
{
this->SetColumn(static_cast<int>(wParam), reinterpret_cast<LPLVCOLUMN>(lParam));
bHandled = true;
}
}
else
bHandled = false;
return 0;
}
и т.п.
далее пишу конкретный класс предметной области
#include "MySimpleGridCtrl.h"
class CObjectRegisterView : public CMySimpleGridCtrlImpl< CObjectRegisterView, CListViewCtrl, CMySimpleGridListTraits >
{
public:
//DECLARE_WND_SUPERCLASS(_T("CObjectRegisterView"), CListViewCtrl::GetWndClassName())
typedef CMySimpleGridCtrlImpl< CObjectRegisterView, CListViewCtrl, CMySimpleGridListTraits > baseClass;
CObjectRegisterView();
~CObjectRegisterView();
BOOL PreTranslateMessage(MSG* pMsg);
BEGIN_MSG_MAP(CObjectRegisterView)
MESSAGE_HANDLER(WM_CREATE, OnCreate)
//REFLECTED_NOTIFY_CODE_HANDLER(LVN_GETDISPINFO, OnGetDispInfo)
CHAIN_MSG_MAP(baseClass)
DEFAULT_REFLECTION_HANDLER()
END_MSG_MAP()
// Handler prototypes (uncomment arguments if needed):
// LRESULT MessageHandler(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
// LRESULT CommandHandler(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
// LRESULT NotifyHandler(int /*idCtrl*/, LPNMHDR /*pnmh*/, BOOL& /*bHandled*/)
LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/);
CObjectRegisterDoc m_ObjectRegisterDoc;
};
На этапе линковки ошибка LNK2019 не найдена реализация OnInsertColumn базового класса.
При переносе реализации в H-файл все нормально. Единственное неудобно — на каждый чих в реализации начинают перекомпилироваться все CPP-файлы, куда заинклуден этот H-файл.
Подскажите — есть выход из этой ситуации?
Спасибо.
добавлена разметка — Кодт