Здравствуйте!
При работе с 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-файл.
Подскажите — есть выход из этой ситуации?
Спасибо.
добавлена разметка — Кодт
Здравствуйте, abrec, Вы писали:
A>На этапе линковки ошибка LNK2019 не найдена реализация OnInsertColumn базового класса.
A>При переносе реализации в H-файл все нормально. Единственное неудобно — на каждый чих в реализации начинают перекомпилироваться все CPP-файлы, куда заинклуден этот H-файл.
A>Подскажите — есть выход из этой ситуации?
A>Спасибо.
Нету. Это плата за использование шаблонов.
Компилятор должен видеть реализацию в месте инстанциирования шаблона.
Реализация в отдельном файле допускается для конкретного класса.
Т.е. уберите все template<> c вашего класса — тогда пожалуйста:
// h
class CMySimpleGridCtrlImpl :
public CWindowImpl<CMySimpleGridCtrlImpl>,
public CCustomDraw< CMySimpleGridCtrlImpl <T, TBase, TWinTraits > >,
public CMessageFilter
LRESULT OnInsertColumn(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
// cpp
LRESULT CMySimpleGridCtrlImpl::OnInsertColumn(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
ЗЫ. для кода на C++ можно использовать тэг [cpp]
"abrec" <3201@users.rsdn.ru> wrote in message
news:2620659@news.rsdn.ru...
> Здравствуйте!
> При работе с WTl обратил внимание, что объявления и реализации методов параметризованных классов находятся в H-файлах.
> Пишу свой грид на основе CListViewCtrl
>
> На этапе линковки ошибка LNK2019 не найдена реализация OnInsertColumn базового класса.
> При переносе реализации в H-файл все нормально. Единственное неудобно — на каждый чих в реализации начинают перекомпилироваться все CPP-файлы, куда заинклуден этот H-файл.
> Подскажите — есть выход из этой ситуации?
> Спасибо.
>
Поскольку конкретных классов предметной области скорее всего будет довольно мало, наверное удобнее будет применить принудительное инстанцирование — поместить реализацию части методов (того же OnInsertColumn) в
отдельный заголовочный файл, который подключать только в файлы с реализацией конкретных классов. И в конце каждого такого файла с реализацией писать template class CMySimpleGridCtrlImpl< CObjectRegisterView, CListViewCtrl, CMySimpleGridListTraits >; и т.п.
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Здравствуйте, Sergey, Вы писали:
S>"abrec" <3201@users.rsdn.ru> wrote in message news:2620659@news.rsdn.ru...
>> Здравствуйте!
>> При работе с WTl обратил внимание, что объявления и реализации методов параметризованных классов находятся в H-файлах.
>> Пишу свой грид на основе CListViewCtrl
>>
>> На этапе линковки ошибка LNK2019 не найдена реализация OnInsertColumn базового класса.
>> При переносе реализации в H-файл все нормально. Единственное неудобно — на каждый чих в реализации начинают перекомпилироваться все CPP-файлы, куда заинклуден этот H-файл.
>> Подскажите — есть выход из этой ситуации?
>> Спасибо.
>>
S>Поскольку конкретных классов предметной области скорее всего будет довольно мало, наверное удобнее будет применить принудительное инстанцирование — поместить реализацию части методов (того же OnInsertColumn) в отдельный заголовочный файл, который подключать только в файлы с реализацией конкретных классов. И в конце каждого такого файла с реализацией писать template class CMySimpleGridCtrlImpl< CObjectRegisterView, CListViewCtrl, CMySimpleGridListTraits >; и т.п.
Спасибо за идею.