Ошибка C3867 при вызове функции класса с CreateThread

Я пытаюсь передать функцию класса CreateThread, вызванную из основной функции, я получил ошибку:

ошибка C3867: 'Display::fill_matrix': отсутствует список аргументов при вызове функции; используйте &Display::fill_matrix для создания указателя на член


class Display
{
public:
    Display();
    DWORD WINAPI fill_matrix();
};

Display display;
main() {
    CreateThread(NULL, 0, display.fill_matrix, NULL, 0, 0);
}

1 ответ

Решение

fill_matrix() является нестатической функцией-членом. Поэтому его первым аргументом является указатель на Display экземпляр класса. Это то, на что жалуется компилятор. Обычный способ решить эту проблему - создать статическую функцию-член и передать ее CreateThread, Вот что он хотел бы:

class Display
{
public:
    Display();

    static DWORD WINAPI fill_matrix_static(void* obj_ptr) {
        Display* display_ptr = (Display*) obj_ptr;
        return display_ptr->fill_matrix();
    }

    DWORD WINAPI fill_matrix();
};

и затем назовите это так:

CreateThread(NULL, 0, fill_matrix_static, (void*) &display, 0, 0);
Другие вопросы по тегам