我在Visual Studio 2017中以纯模式使用C ++,我尝试编译并运行在Debugging a Parallel Application in 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的声明如何才能使示例编译并正常运行?
非常感谢您的帮助。
答案 0 :(得分:2)
在此构造函数中
RunFunc(Func func,int o):m_Func(func),m_o(o)
{
};
编译器将{prameter Func func
调整为类型Func *func
。另一方面,数据成员m_Func
被声明为引用类型。
Func& m_Func;
错误消息说明了类型的不兼容性。
C2440无法从'void(_cdecl *)(int)'转换为'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;
}
答案 1 :(得分:1)
在你的代码中,你要绑定一个临时引用,即传递给构造函数的参数的副本。您可以尝试运行以下代码段来查看差异:
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;
}
答案 2 :(得分:1)
这是一种传统方法。您可以使用标准库Jsfiddle。例如:
#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;
}