CWnd Errore C3867 usare & per creare un puntatore

di JanfriB il
15 risposte

Buongiorno a tutti,

Premetto che non sono un esperto di C++. >Devo convertire dei progetti dalla versione c++ V6 ad una versione pi+ recente quindi li ho inseriti in una soluzione Visual Studio 2019. Non ho ne manuale tecnico ne memo del programmatore che ha sviluppato i progetti,

Durante la compilazione riscontro questo errore che non so come risolvere.

Error C3867 non-standard syntax use & to create a pointer to member

 Nel seguente contesto di chiamata ad un metodo

m_headerctrl.SetCallback( this, (void (CWnd::*)(int, int))DragColumn );	

Dove, suppongo, il metodo ritorna il posizionamento di un oggetto 

void CHeaderCtrlEx::SetCallback(CWnd* pWnd, void (CWnd::*fpDragCol)(int, int) )
{
    m_fpDragCol = fpDragCol;
    m_pOwnerWnd = pWnd;
}

La classe CWnd è dichiarata nel header afxwin.h

Qualcuno può aiutarmi a capire e quindi a risolvere il problema.

Grazie

15 Risposte

  • Ciao,

    hai provato a passare il parametro con l'operatore "&"
    Esempio : 

    m_headerctrl.SetCallback(this, &(void (CWnd::*)(int, int))DragColumn);

    In tal modo dovrebbe consideralo come un riferimento ad un puntatore e non solo come un valore

  • Buonasera, si è una delle prime cose che ho provato 

  • Prima del nome della funzione

    &DragColumn

  • Provato anche quello ma :

    Error    C2276    '&': illegal operation on bound member function expression
  • Ma DragColumn  è un metodo di quale classe?

    Devi aggiungerela classe per ottenere il puntatore

    &Class::DragColumn 

  • Quindi

    &CListCtrlEx::DragColumn 

  • No ,

    secondo me dobbiamo cercare di capire cosa fa, o più che altro come lo fa, e magari impostarlo in modo diverso..

    Per esempio io non ho mai visto una chiamata ad un metodo  con dei parametri impostati in questo modo e mi piacerebbe capirla

    SetCallback( this, (void (CWnd::*)(int, int))DragColumn );

    Il problema è che si sta parlando di referenza di puntatori, a quanto ho capito  

  • Scusa non si è allegata l'immagine. no = Non va bene

    Poichè l'asterisco è una assegnazione di puntatore mi domandavo il significato di questo visto che CWnd è una classe e non un metodo

    CWnd::*

    Indicato nella chiamata al metodo 

    SetCallback( this, (void (CWnd::*)(int, int))DragColumn )
    void CHeaderCtrlEx::SetCallback(CWnd* pWnd, void (CWnd::*fpDragCol)(int, int) )
    {
    	m_fpDragCol = fpDragCol;
    	m_pOwnerWnd = pWnd;
    }
  • Ma mica ti dicevo di metterlo lì !

    Dicevo qui

    m_headerctrl.SetCallback( this, (void (CWnd::*)(int, int))&CListCtrlEx::DragColumn );	
  • Scusa la tua indicazione e corretta, verificherò e approfondirò il tema.  

  • Puoi inviare tutto il progetto in uno zip? Vederlo di persona e provare mi sembra l'unico modo per tentare di provare senza fare mille post.

  • Perdona sei stato veloce a rispondere il problema della referenza è sistemato chiudo questo ticket (ma mi sa che ne verranno altri :-) )

    La condizione giusta sembra essere quella indicata:

    m_headerctrl.SetCallback( this, (void (CWnd::*)(int, int))&CListCtrlEx::DragColumn );

    Ovviamente ringrazio 

Devi accedere o registrarti per scrivere nel forum
15 risposte