【问题标题】:C2440 cannot convert from 'void (_cdecl*)(int)' to 'void(_cdecl&)(int)C2440 无法从 'void (_cdecl*)(int)' 转换为 'void(_cdecl&)(int)
【发布时间】:2018-08-23 05:17:51
【问题描述】:

我在 Visual Studio 2017 中以本机模式使用 C++,并且我尝试编译和运行在 Debugging a Parallel Application in Visual Studio 找到的示例代码。 作为记录,我用 C 而不是 C++ 编程。当谈到方法声明(以及许多其他事情)时,我一无所知。我怀疑纠正错误很简单,但我根本不知道如何。

换句话说,我目前是 RTFineM。我只是复制并粘贴了上面 url 中给出的示例并遇到了 2 个问题。首先它抱怨某些东西被弃用了,但是一个简单的定义就解决了这个问题。其次,它抱怨无法将一种类型转换为标题中所述的另一种类型。

导致问题的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 的声明需要如何才能使示例正确编译和运行?

谢谢,非常感谢您的帮助。

【问题讨论】:

  • 是的,MSDN 中的示例代码又被破坏了。最简单的解决方法是将m_Funcfunc 声明为Func *,并且根本不处理对函数的引用。
  • 请发布Func 的定义方式。

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


【解决方案1】:

在这个构造函数中

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

   };

编译器将参数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;
}

【讨论】:

  • 非常感谢,这就像一个魅力。现在我可以使用示例来按照说明进行操作。 :-)
【解决方案2】:

在您的代码中,您试图将引用绑定到一个临时对象,即传递给构造函数的参数副本。可以尝试运行以下代码 sn -p 看看有什么区别:

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

【讨论】:

  • 感谢您的帮助,我非常感谢您发布的内容也很有效。我给 Vlad 打勾是因为他的回答是正确的,而且他是第一个,但我同样感谢您的帮助。
【解决方案3】:

这是一种传统方法。您可以使用标准库functor and binder instead。例如:

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

【讨论】:

  • 这听起来绝对像是示例代码使用了遗留结构。它做的第一件事就是抱怨某些类被弃用了。它从那里走下坡路。 ;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-05
  • 2013-08-29
  • 1970-01-01
  • 1970-01-01
  • 2018-02-26
  • 1970-01-01
相关资源
最近更新 更多