Я новичок в C++/cli, поэтому, пожалуйста, извините меня за глупые вопросы или основные ошибки:C++/cli to C++: ошибка несовместима с «void (__stdcall *) (int i, std :: string str)»
Мой C класс Библиотека ++/CLI, который вызывается C# имеет только один метод:
ThreadsCppWrapper.h
namespace namespace ThreadsCppWrapper {
public ref class ThreadsCppWrapperClass
{
public:
ThreadsCppWrapperClass(); // Constructor
System::String^ mytrainOp(System::MulticastDelegate^ callbackfunction);
private:
MyThreadsCpp::MyThreadsCppClass* ptr;
};
}
ThreadsCppWrapper.cpp
System::String^ ThreadsCppWrapper::ThreadsCppWrapperClass::mytrainOp(System::MulticastDelegate^ callbackfunction){
System::String^ toReturn = gcnew System::String("");
msclr::interop::marshal_context context;
System::IntPtr intPtr = System::Runtime::InteropServices::Marshal::GetFunctionPointerForDelegate(callbackfunction);
if (intPtr != System::IntPtr::Zero)
{
myUpdateProgress functPtr = static_cast<myUpdateProgress>(intPtr.ToPointer());
string stdstringResult = ptr->train(functPtr); // Error Here // ERRORLINE
//toReturn = context.marshal_as<System::String^>(stdstringResult);
}
else
{
System::Console::WriteLine("Error: Could not cast delegate!!");
}
return toReturn;
}
Класс C++, которая вызывается из класса C++/CLI является:
MyThreadsCpp.h
namespace MyThreadsCpp{
class MyThreadsCppClass
{
public:
MyThreadsCppClass();
string train(void(CALLBACK *myUpdateProgress)(int i, string str));
};
}
MyThreadsCpp.cpp
string MyThreadsCpp::MyThreadsCppClass::train(void(CALLBACK *myUpdateProgress)(int i, string str)){
double sum = 0.0;
long max = 100 * 1000;
int perc = 0;;
string trainstat = "Training Status: Starting Training...";
ostringstream oss;
myUpdateProgress(perc, trainstat);
for (long n = 0; n < max; n++){
sum += 4.0*pow(-1.0, n)/(2 * n + 1.0);
int rem = n % (max/10);
if (rem == 0){
perc = 100 * n/max;
cout << perc << "%" << endl;
/* report completion status */
oss << "Training Status: " << perc;
myUpdateProgress(perc, oss.str());
}
}
cout << "100%" << endl;
ostringstream oss;
oss << "Result = " << sum;
return oss.str();
}
Он отлично компилируется.
Intellisense Ошибка в классе обертки ERRORLINE: 1 аргумент типа "myUpdateProgress" несовместим с параметром типа "пустота (__stdcall *) (INT I, станд :: строка ул)" в ThreadsCppWrapper.cpp
Эксперты, пожалуйста, помогите.
Вы задали тип 'myUpdateProgress' где-нибудь? (Очень сложно использовать одно и то же имя для обоих типов и переменных/параметров.) – molbdnilo
Привет, @molbdnilo, спасибо за ответ. Не могли бы вы помочь мне с фрагментом кода? – user5579704
Когда Intellisense и компилятор не согласны, компилятор прав. Обычно лучше рассматривать ошибки Intellisense как полезные подсказки. – molbdnilo