Указатель на член является недопустимым или как передать имя функции в другую функцию. Переход с С на С++

возник вопрос в С можно было делать так:


    //объявления   
    UG_S16 UG_Init( UG_GUI* g, void (*p)(UG_S16,UG_S16,UG_COLOR), UG_S16 x, UG_S16 y );    
    UG_GUI GUI_1;
    void UserSetPixel(UG_S16 x, UG_S16 y, UG_COLOR c) 
        {
         SetPixel(x, y, c);
        }

// часть кода исполняемой функции в которую передаётся внешняя функция

UG_S16 UG_Init( UG_GUI* g, void (*p)(UG_S16,UG_S16,UG_COLOR), UG_S16 x, UG_S16 y )
{
   UG_U8 i;

   g->pset = (void(*)(UG_S16,UG_S16,UG_COLOR))p;
//.....   }
    //вызов в программе
    UG_Init(&GUI_1,  UserSetPixel , 320, 240);

попытка повторить в С++ не увенчалась успехом :( я недавно начал переходить с С на С++ вот код в с++:


private:    void* UserSetPixel(UG_S16 x, UG_S16 y, UG_COLOR c) {
                myBitmap->SetPixel(x, y, Color::FromArgb(c));
        }
    private: System::Void создатьНовуюGUIToolStripMenuItem_Click(System::Object^  sender, System::EventArgs^  e) 
    {

//создание головного пункта
        if (treeView1->SelectedNode->Index == 0) {
            in++;
            treeView1->SelectedNode->Nodes->Add("GUI", "GUI",in);
            treeView1->ContextMenuStrip = this->contextMenuStrip2;
            treeView1->SelectedNode->ContextMenuStrip;

            UG_GUI GUI_1;
            UG_Init(&GUI_1,  UserSetPixel , 320, 240);
        }
    }

Ошибка ссылается на UserSetPixel в строке UG_Init(&GUI_1, UserSetPixel , 320, 240); смотрел тут https://learn.microsoft.com/ru-ru/cpp/cpp/pointers-to-members?view=msvc-170 но так и не смог разобраться...


Ответы (1 шт):

Автор решения: Vladimir Netu

Решение: замена void* на int*, так как определение void* - это указатель на несуществующий связанный с ним тип данных.

//объявления
    UG_S16 UG_Init(UG_GUI* g, int(*p)(UG_S16, UG_S16, UG_COLOR), UG_S16 x, UG_S16 y);
    int UserSetPixel(UG_S16 x, UG_S16 y, UG_COLOR c)
        {
            this->myBitmap->SetPixel(x, y, Color::FromArgb(c));
        }
// функция вызова
UG_S16 UG_Init( UG_GUI* g, int(*p)(UG_S16,UG_S16,UG_COLOR), UG_S16 x, UG_S16 y )
{
   UG_U8 i;

   g->pset = p(UG_S16,UG_S16,UG_COLOR); //(int(*)(UG_S16, UG_S16, UG_COLOR))p
//.......
} 

//вызов функции
UG_GUI GUI_1;
UG_Init(&GUI_1,  UserSetPixel , 320, 240);

помощь оказала вот эта статья.

Всем спасибо за помощь и направление в нужную сторону.

→ Ссылка