简体   繁体   中英

C2440 cannot convert from 'void (_cdecl*)(int)' to 'void(_cdecl&)(int)

I am using C++ in native mode with Visual Studio 2017 and I am trying to compile and run the example code found at Debugging a Parallel Application in Visual Studio . For the record, I program in C not C++. I am clueless when it comes to method declarations (among many other things). I suspect correcting the error is simple but, I simply don't know how.

In other words, I am currently RTFineM. I simply copied and pasted the example given in the url above and ran into 2 problems. First it complained about something being deprecated but a simple define took care of that problem. Second it complained about not being able to convert a type into another as stated in the title.

The RunFunc class causing the problem is declared as follows:

 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);
   };
 };

My question/request is: how does the declaration of RunFunc need to be in order for the example to compile and run properly ?

Thank you, much appreciate the help.

In this constructor

   RunFunc(Func func,int o):m_Func(func),m_o(o)
   {

   };

the prameter Func func is adjusted by the compiler to the type Func *func . On the other hand the data member m_Func is declared as a referenced type.

Func& m_Func;

And the error message says about incompatibility of the types.

C2440 cannot convert from 'void (_cdecl*)(int)' to 'void(_cdecl&)(int)

Try to declare the constructor like

   RunFunc(Func &func,int o):m_Func(func),m_o(o)
   {

   };

Or declare the data member like

Func *m_Func;

without changing the constructor.

Here are two demonstrative programs

#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;
}

and

#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;
}

In your code you are tyring to bound a reference to a temporary, namely to copy of argument passed to the constructor. You can try to run the following code snippet to see the difference:

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

This is a legacy approach. You can use standard library functor and binder instead . For example:

#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;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM