C2440无法从'void(_cdecl *)(int)'转换为'void(_cdecl&)(int)

时间:2018-03-14 15:31:11

标签: c++ pointers constructor reference type-conversion

我在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的声明如何才能使示例编译并正常运行?

非常感谢您的帮助。

3 个答案:

答案 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;
}