2017-11-07 8 views
2

Ich versuche, Zeiger auf eine void * Funktion innerhalb der Hauptmethode aufrufen und der Compiler sagt assigning to 'funcptr<g>' from incompatible type 'void *(void *). hello Funktion ist eigentlich ein Argument zu pthread_create Funktion. Deshalb ist es void * Funktion. Wie kann ich einen Funktionszeiger auf eine void * Funktion erstellen?Zeiger auf eine void * -Funktion C++

#include <iostream> 
#include <pthread.h> 

using namespace std; 

template<typename T> 
using funcptr = void (*T::*)(void *); // I think it is wrong here. 

class m { 
public: 
    template <typename T> 
    struct my_struct { 
     funcptr<T> ptr; 
    }; 
}; 

class g { 
public: 
    static void *hello(void *); 
}; 

int main() { 
    struct m::my_struct<g> h; 
    h.ptr = g::hello; // Error here 

    return 0; 
} 
+0

Ich bin nicht sicher, was die neue Art und Weise, dies zu tun, aber ich immer nur tat 'typedef void (* funcptr) (void *);' –

+0

Seit 'hallo 'ist eine statische Funktion, brauchen Sie nicht' funcptr' auf Vorlage: 'mit funcptr = void * (*) (void *);' Für Klasse m: 'Klasse m { public: \t struct my_struct { \t \t funcptr ptr; \t}; }; ' In Haupt: ' struct m :: my_struct h; h.ptr = & g :: hallo; // Nimm die Adresse von hallo' – kjpus

+1

Verwende std :: thread, verwende keine OS-Threads direkt. –

Antwort

2

Wie kann ich einen Funktionszeiger auf eine void * Funktion erstellen? hello ist keine Elementfunktion, aber es ist eine statische Funktion.

Ihre funcptr sollte also wie folgt aussehen:

// No template needed. 
using funcptr = void* (*)(void *) 

Beachten Sie, dass hello mit statischen, meaning that it's no longer a member function to g deklariert wird.

Statische Elemente einer Klasse sind nicht mit den Objekten der Klasse zugeordnet.

So void (*T::*)(void *) zu verwenden, um Nichtmitgliedsfunktionen auszuschließen, ist falsch.

Wenn Sie einen Compiler verwenden dürfen, die ++ 11 C unterstützt, Sie brauchen nicht einmal zu manuell seiner Art abziehen mehr, mit decltype:

// decltype deducts its exact type for you. 
using funcptr = decltype(&g::hello); 

class m 
{ 
public: 
    struct my_struct 
    { 
     funcptr ptr; 
    }; 
}; 

FYI, da hello tut Wenn Sie keine Definition haben, können Sie auf einen Verknüpfungsfehler stoßen. Um zu verhindern, dass, ging ich davon aus, dass es einige Implementierung innen:

static void *hello(void *) 
{ 
    // Meaningless, but.. 
    return nullptr; 
} 
+0

Danke !! Genau das, was ich brauchte. – pseudo

1

wenn Sie mit C 11 ++, können Sie std::function<> verwenden, die den Rückgabetyp stört nur um und Parameter der Funktion und nicht, wo sie sind definiert und was ist sein Typ. Hier

ist der Code mit std::function<>

#include <iostream> 
#include <functional> 
#include <pthread.h> 

using namespace std; 

class m { 
public: 
    template <typename T> 
    struct my_struct { 
     function<void*(void*)> ptr; 
    }; 
}; 

class g { 
public: 
    static void *hello(void *) { 
     cout<<"Hello.."<<endl; 
    } 
}; 

int main() { 
    struct m::my_struct<g> h; 
    h.ptr = g::hello; 
    h.ptr(nullptr); 

    return 0; 
} 
+1

'std :: function' ist übertrieben, wenn nur ein einfacher Funktionszeiger benötigt wird. Außerdem gibt es keine Antwort auf die Frage: "Wie kann ich einen Funktionszeiger auf eine void * -Funktion erstellen?" – geza