Я пытаюсь присоединиться старый кусок кода в C моей нынешней VC++ проекта:ошибка C2664 вследствие Cdecl и MyCLASS конфликт
// .h
class DMSinv : public CDialog {
double finte(double z);
double ITFStolz(double Zp1, double Zp2, double Zc);
};
// .cpp
double Zcglob;
double DMSinv::finte(double z)
{
return TFStolz(z, Zcglob);
}
double DMSinv::ITFStolz(double Zp1, double Zp2, double Zc)
{
int ierr;
Zcglob = Zc;
return (coteglob(&DMSinv::finte, Zp1, Zp2, 1.0e-10, &ierr));
//error C2664: 'DMSinv::coteglob' : cannot convert parameter 1 from 'double (__thiscall DMSinv::*)(double)' to 'double (__cdecl *)(double)'
}
функция coteglob происходит от старого C части, и finte является промежуточную функцию для передачи функции TFStolz в coteglob.
Я искал на форумах и нашел этот родственный вопрос: How to convert void (__thiscall MyClass::*)(void *) to void (__cdecl *)(void *) pointer , который я пытался применить таким образом:
// .h
class DMSinv : public CDialog {
virtual double finte(double z);
double ITFStolz(double Zp1, double Zp2, double Zc);
};
// .cpp
double Zcglob;
extern "C"
{
static double __cdecl finteHelper(double z)
{
DMSinv* datainv = reinterpret_cast<DMSinv> (z); //error C2440: 'reinterpret_cast' : cannot convert from 'double' to 'DMSinv'
datainv->finte(z);
}
}
double DMSinv::ITFStolz(double Zp1, double Zp2, double Zc)
{
int ierr;
Zcglob = Zc;
double solution = coteglob(&finteHelper, Zp1, Zp2, 1.0e-10, &ierr);
return solution;
}
, но до сих пор не работает. Может ли кто-нибудь направить меня на то, как его адаптировать? Я еще совсем новичок, и это кажется далеким от моих знаний.
Заранее благодарен!
'DMSinv * datainv = reinterpret_cast < DMSinv > (z)' - не следует ли использовать команду 'DMSinv *'? – SomeWittyUsername
Я пробовал, но это дает мне ту же ошибку: 'error C2440: 'reinterpret_cast': не может конвертировать из 'double' в 'DMSinv *'' – madoro