Ошибка компиляции при вызове функции члена шаблона
От: NiJazz Австралия  
Дата: 08.07.08 15:02
Оценка:
Пытаюсь написать класс для замены диалоговой процедуры не статической функцией-членом любого класса, имеющей соответствующую сигнатуру.
Вот что имеем:

#pragma once

template <typename T>
class WndProcHooker
{
public:

    typedef LRESULT ( CALLBACK T::* MWNDPROC )( HWND hwnd_, UINT msg_, WPARAM wparam_, LPARAM lparam_ );

    WndProcHooker( HWND hwnd_, T * t_, MWNDPROC mem_proc_, bool hook_now_ = false )
        :    m_hwnd( hwnd_ ),
            m_pt( t_ ),
            m_mem_proc( mem_proc_ ),
            m_proc( 0 )
    {        
        m_this = this;

        if ( hook_now_ )
            hook();
    }

    bool hook()
    {
        if ( !m_proc )
            m_proc = reinterpret_cast<WNDPROC>( ::SetWindowLongPtr( m_hwnd, GWLP_WNDPROC, 
                                                reinterpret_cast<LONG_PTR>( _wnd_proc ) ) );
        return !!m_proc;
    }

    ~WndProcHooker()
    {
        try
        {
            ::SetWindowLongPtr( m_hwnd, GWLP_WNDPROC, reinterpret_cast<LONG_PTR>( m_proc ) );
        }
        catch ( ... )
        {
        }
    }

private:

    static LRESULT CALLBACK    _wnd_proc( HWND hwnd_, UINT msg_, WPARAM wparam_, LPARAM lparam_ )
    {
        if ( !m_this )
            return ::DefWindowProc( hwnd_, msg_, wparam_, lparam_ );

        return m_this->m_pt->( *m_mem_proc )( hwnd_, msg_, wparam_, lparam_ );    
    }

    static WndProcHooker * m_this;

    WNDPROC        m_proc; 
    HWND        m_hwnd;

    T *            m_pt;
    MWNDPROC    m_mem_proc;

};


Инстанцируем шаблон:
struct C
{
    LRESULT CALLBACK _wnd_proc( HWND hwnd_, UINT msg_, WPARAM wparam_, LPARAM lparam_ )
    {
        return 0;
    }
};

void f()
{
    C c;

    WndProcHooker<C> h( 0, &c, &C::_wnd_proc );
}



return m_this->m_pt->( *m_mem_proc )( hwnd_, msg_, wparam_, lparam_ );

Компилятор (Visual C++ 9.0) жалуется в этом месте: C2059: syntax error : '('

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