Проблема со связыванием, функция-член c ++ для обратного вызова C - PullRequest
5 голосов
/ 04 октября 2010

Я пытаюсь связать функцию-член c ++ с унаследованной библиотекой C, используя указатель на функцию - я не могу понять, почему это приводит к ошибкам связи, может кто-нибудь понять почему?

ошибки связи

/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'

скомпилировать с помощью: g ++ callback.cpp -o callback

#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;
}

Ответы [ 2 ]

2 голосов
/ 04 октября 2010

static Verify* vfy;

Вам нужно определить этот статический элемент, декларация [которую вы предоставили] просто недостаточна.Код не пройдет компоновщик, потому что отсутствует определение [статического члена].

Определите vfy вне класса.

Verify* VerifyWrapper::vfy; //definition
1 голос
/ 04 октября 2010

Вы только что объявили свой статический член.Вы также должны определить это.В вашем файле .cpp / .cc добавьте определение.

Verify* VerifyWrapper::vfy;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...