2016-05-26 6 views
-1

Я новичок в 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

Эксперты, пожалуйста, помогите.

+0

Вы задали тип 'myUpdateProgress' где-нибудь? (Очень сложно использовать одно и то же имя для обоих типов и переменных/параметров.) – molbdnilo

+0

Привет, @molbdnilo, спасибо за ответ. Не могли бы вы помочь мне с фрагментом кода? – user5579704

+0

Когда Intellisense и компилятор не согласны, компилятор прав. Обычно лучше рассматривать ошибки Intellisense как полезные подсказки. – molbdnilo

ответ

0

Вы не можете использовать std::string и System::String^ взаимозаменяемо. Вы должны преобразовать их в один тип. Сильное преобразование типа или функции-указателя/обратного вызова не будет работать - оно будет ломаться во время выполнения, если не время компиляции.

+0

Спасибо @Ajay. Моя замечательная строка будет раскоментирована, а ошибка не для строки, это для указателя функции. Пожалуйста, помогите с некоторым фрагментом кода, если сможете. – user5579704

+0

«Он прекрасно компилируется». - Тогда почему ты волнуешься. Игнорировать ошибки Intellisense! – Ajay

+0

У меня есть ошибка в строке, где я прокомментировал: string stdstringResult = ptr-> train (functPtr); // Ошибка здесь // ERRORLINE – user5579704