2010-10-04 14 views
5

Estoy intentando conectar una función de miembro de C++ con una biblioteca de C heredada que toma un puntero de función. No veo por qué esto sigue apareciendo con errores de enlace. ¿Alguien puede verlo? por qué ?Problema con la vinculación, función de miembro de C++ a devolución de llamada de C

errores de enlace

/tmp/ccl2HY1E.o: In function `VerifyWrapper::verifyGlue(int)': callback.cpp:(.text._ZN13VerifyWrapper10verifyGlueEi[VerifyWrapper::verifyGlue(int)]+0xe): undefined reference to `VerifyWrapper::vfy' 
/tmp/ccl2HY1E.o: In function `VerifyWrapper::set(Verify&)': callback.cpp:(.text._ZN13VerifyWrapper3setER6Verify[VerifyWrapper::set(Verify&)]+0xf): undefined reference to `VerifyWrapper::vfy' 

compilar con: g ++ CallBack.cpp -o devolución de llamada

#include <iostream> 
using namespace std; 

class Verify 
{ 
public: 
    int verify(int i) { return i * 2; }; 
}; 


class VerifyWrapper 
{ 
public: 
    static int verifyGlue(int i) { return vfy->verify(i); }; 
    static void set(Verify& v) { vfy = &v;}; 
private: 
    static Verify* vfy; 
}; 


// legacy function 
int func(int i, int(*f)(int)) 
{ 
int ret = f(i); 
return ret; 
} 

int main(void) 
{ 
int i = 10; 
Verify v; 
VerifyWrapper::set(v); 
int ret = func(10, &VerifyWrapper::verifyGlue); 
cout << "result : " << ret << endl; 

return 0; 
} 

Respuesta

2

static Verify* vfy;

Es necesario definir a este miembro estática, la declaración [que nos ha proporcionado ] simplemente no es suficiente. El código no pasará el vinculador porque falta la definición [del miembro estático].

Defina vfy fuera de la clase.

Verify* VerifyWrapper::vfy; //definition 
+0

muchas gracias! – Stonky

+0

@Stonky: Si está satisfecho con mi respuesta, puede revocarla y aceptarla haciendo clic en la marca de verificación [al lado de mi respuesta] ';)' –

+0

. Aparentemente, no puedo hacerlo si durante otros 6 minutos. – Stonky

1

Usted solo ha declarado su estado estático. También necesitas definirlo. En su archivo .cpp/.cc agregue la definición.

Verify* VerifyWrapper::vfy; 
Cuestiones relacionadas