我在VisualStudio2017中以本机模式使用C++,正在尝试编译和运行在在Visual中调试并行应用程序中找到的示例代码。为了记录在案,我用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的声明如何才能正确编译和运行?
谢谢,非常感谢你的帮助。
发布于 2018-03-14 15:35:57
在这个构造函数中
RunFunc(Func func,int o):m_Func(func),m_o(o)
{
};prameter Func func由编译器调整为Func *func类型。另一方面,数据成员m_Func被声明为引用类型。
Func& m_Func;错误信息说明了类型的不兼容性。
C2440不能从“_cdecl*(Int)”转换为“_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;
}发布于 2018-03-14 15:40:03
在您的代码中,您将键入绑定对临时引用的引用,即复制传递给构造函数的参数。您可以尝试运行以下代码片段来查看两者之间的差异:
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;
}发布于 2018-03-14 15:46:04
这是一种遗留的方法。您可以使用标准库函子和粘结剂。例如:
#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;
}https://stackoverflow.com/questions/49281777
复制相似问题