WTL и параметризованные классы
От: abrec Россия  
Дата: 14.08.07 13:11
Оценка:
Здравствуйте!
При работе с 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-файл.
Подскажите — есть выход из этой ситуации?
Спасибо.

добавлена разметка — Кодт
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.