Проблема с преобразованием из Visual C++ 6.0 в Visual Studio 2012

У меня есть проект Visual C++ 6.0, который мне нужно обновить, и я без проблем импортирую его в Visual Studio 2012, однако во время компиляции я получаю следующие четыре ошибки:

Ошибка 1 ошибка C2440: «static_cast»: невозможно преобразовать из «void (__thiscall CTrendDlg::*) (int)» в «void (__thiscall CCmdTarget::*) (UINT)» c:\users\nima\desktop\ffls_scode\ Trenddlg.cpp 89

Ошибка 6 ошибка C2440: «static_cast»: невозможно преобразовать из «void (__thiscall CManualDlg::*) (int)» в «void (__thiscall CCmdTarget::*) (UINT)» c:\users\nima\desktop\ffls_scode\ manualdlg.cpp 175

Ошибка 7 ошибка C2440: «static_cast»: невозможно преобразовать из «void (__thiscall CManualDlg::*) (int)» в «void (__thiscall CCmdTarget::*) (UINT)» c:\users\nima\desktop\ffls_scode\ manualdlg.cpp 177

Ошибка 8 ошибка C2440: «static_cast»: невозможно преобразовать из «void (__thiscall CManualDlg::*) (int)» в «void (__thiscall CCmdTarget::*) (UINT)» c:\users\nima\desktop\ffls_scode\ manualdlg.cpp 178

Первая ошибка возникает из-за следующей строки кода, остальные аналогичны:

ON_COMMAND_RANGE(IDC_CHECK_PEN, IDC_CHECK_GRID, OnCheckButtons)
ON_COMMAND_RANGE(IDC_REF_L1, IDC_REF_L16, OnCarriagePos)
ON_COMMAND_RANGE(IDC_VALVE_L1, IDC_VALVE_L4, OnValve)
ON_COMMAND_RANGE(IDC_SAMPLE_L_A, IDC_SAMPLE_L_B, OnDetector)

Где (например) функция OnCheckButtons определена в TrendDlg.cpp следующим образом:

void CTrendDlg::OnCheckButtons(int id) 
{
    UINT    state;
    RECT    rect = {m_rect.left-60, m_rect.top-10, m_rect.right+40,       m_rect.bottom+30};

state = ((CButton*)GetDlgItem(id))->GetState();
if ((state & 0x0003) == 1)
{
    switch (id)
    {
    case    IDC_CHECK_PEN:
        m_pen = TRUE;
        break;
    case    IDC_CHECK_LINE:
        m_line = TRUE;
        break;
    case    IDC_CHECK_BUBBLES:
        m_bubble = TRUE;
        break;
    case    IDC_CHECK_GRID:
        m_grid = TRUE;
    }
}
else
{
    switch (id)
    {
    case    IDC_CHECK_PEN:
        m_pen = FALSE;
        break;
    case    IDC_CHECK_LINE:
        m_line = FALSE;
        break;
    case    IDC_CHECK_BUBBLES:
        m_bubble = FALSE;
        break;
    case    IDC_CHECK_GRID:
        m_grid = FALSE;
    }
}
InvalidateRect(&rect);  

}

мой диапазон карт сообщений также определяется как:

  BEGIN_MESSAGE_MAP(CTrendDlg, CDialog)

Почему компилятор пытается привести типы CTrendDlg и CManualDlg к типу CCmdTarget? есть ли изменения в структуре классов от VC 6.00 до VS2012?

Я ценю вашу помощь.


person Nima Nikvand    schedule 11.05.2016    source источник
comment
Согласно документации, Параметр функции-обработчика должен быть целым числом без знака — он у вас есть как целое число со знаком.   -  person Dan Mašek    schedule 11.05.2016
comment
Спасибо, такая простая проблема, я думал компилятор проигнорирует такую ​​небольшую разницу в прототипе функции!   -  person Nima Nikvand    schedule 11.05.2016
comment
Это два разных типа, каждый с разным диапазоном значений, это более чем небольшая разница, и, конечно же, компилятор не должен пренебрегать этим. Как упоминает marcinj, компилятор C++ в VS6, безусловно, не является воплощением соответствия стандартам, поэтому не ожидайте, что код будет правильным только потому, что он не жалуется.   -  person Dan Mašek    schedule 11.05.2016


Ответы (2)


Ваш обработчик должен быть определен следующим образом:

void CTrendDlg::OnCheckButtons(UINT id) 

Так что в основном измените int на UINT

person Andrew Komiagin    schedule 11.05.2016

Посмотрите, как следует использовать этот макрос ON_COMMAND_RANGE:

1) Вам нужна правильная подпись, верните void и параметр должен быть типа UINT

2) Укажите свой метод с именем класса:

ON_COMMAND_RANGE(IDC_CHECK_PEN, IDC_CHECK_GRID, &CTrendDlg::OnCheckButtons)
                                                ^^^^^^^^^^^^

VS 6.0 довольно старый, современные версии VS более соответствуют стандартам.

person marcinj    schedule 11.05.2016