Я использую C++ в собственном режиме с Visual Studio 2017, и я пытающийся для компиляции и запуска примера кода, найденного в Отладка параллельного приложения в Visual Studio. Для справки, я программирую на C, а не на C++. Я не понимаю, когда дело доходит до объявлений методов (среди прочего). Я подозреваю, что исправить ошибку просто, но я просто не знаю, как это сделать.
Другими словами, я сейчас RTFineM. Я просто скопировал и вставил пример, приведенный в приведенном выше URL-адресе, и столкнулся с двумя проблемами. Сначала он пожаловался на то, что что-то устарело, но простое определение решило эту проблему. Во-вторых, он пожаловался на невозможность преобразовать один тип в другой, как указано в заголовке.
Класс RunFunc, вызывающий проблему, объявляется следующим образом:
class RunFunc
{
Func& m_Func;
int m_o;
public:
RunFunc(Func func,int o):m_Func(func),m_o(o)
{
};
void operator()()const
{
m_Func(m_o);
};
};
Мой вопрос / просьба: каким должно быть объявление RunFunc, чтобы пример компилировался и работал правильно?
Спасибо, очень признателен за помощь.
Выложите пожалуйста как определяется Func.





В этом конструкторе
RunFunc(Func func,int o):m_Func(func),m_o(o)
{
};
праметр Func func настроен компилятором на тип Func *func. С другой стороны, элемент данных m_Func объявлен как ссылочный тип.
Func& m_Func;
И сообщение об ошибке говорит о несовместимости типов.
C2440 cannot convert from 'void (_cdecl*)(int)' to 'void(_cdecl&)(int)
Попробуйте объявить конструктор как
RunFunc(Func &func,int o):m_Func(func),m_o(o)
{
};
Или объявите член данных как
Func *m_Func;
без изменения конструктора.
Вот две демонстрационные программы
#include <iostream>
typedef void Func( int );
class RunFunc
{
Func& m_Func;
int m_o;
public:
RunFunc(Func &func,int o):m_Func(func),m_o(o)
{
};
void operator()()const
{
m_Func(m_o);
};
};
int main() {
return 0;
}
а также
#include <iostream>
typedef void Func( int );
class RunFunc
{
Func *m_Func;
int m_o;
public:
RunFunc(Func func,int o):m_Func(func),m_o(o)
{
};
void operator()()const
{
m_Func(m_o);
};
};
int main() {
return 0;
}
Большое спасибо, это сработало как шарм. Теперь я могу использовать этот пример, чтобы следовать инструкциям. :-)
В своем коде вы пытаетесь привязать ссылку к временному объекту, а именно к копии аргумента, переданного конструктору. Вы можете попробовать запустить следующий фрагмент кода, чтобы увидеть разницу:
struct Func {
int _i;
void operator()(int i) { cout << i*_i << endl; }
};
class RunFunc
{
Func& m_Func;
int m_o;
public:
RunFunc(Func &func, int o) :m_Func(func), m_o(o)
// RunFunc(Func func, int o) :m_Func(func), m_o(o)
{
};
void operator()()const
{
m_Func(m_o);
};
};
int main() {
Func f{ 5 };
RunFunc rf(f, 2);
rf();
return 0;
}
спасибо за помощь, я очень ценю это, и то, что вы опубликовали, тоже работает. Я поставил галочку Владу, потому что его ответ был правильным, и он был первым, но я также ценю помощь.
Это устаревший подход. Вы можете использовать стандартную библиотеку функтор и связующее вместо. Например:
#include <functional>
#include <iostream>
static void my_callback(int i) {
std::cout<< i << std::endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
std::function<void()> functor;
functor = std::bind(my_callback, 1);
functor();
return 0;
}
это определенно звучит так, как будто в примере кода используются устаревшие конструкции. Первым делом он пожаловался на то, что какой-то класс устарел. Оттуда все пошло под откос. ;-)
Ура, снова сломанный пример кода из MSDN. Самое простое решение - объявить и
m_Func, иfuncкакFunc *и вообще не иметь дело со ссылками на функции.