首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C2440不能从“_cdecl*(Int)”转换为“_cdecl&(Int)”

C2440不能从“_cdecl*(Int)”转换为“_cdecl&(Int)”
EN

Stack Overflow用户
提问于 2018-03-14 15:31:11
回答 3查看 2.8K关注 0票数 2

我在VisualStudio2017中以本机模式使用C++,正在尝试编译和运行在在Visual中调试并行应用程序中找到的示例代码。为了记录在案,我用C而不是C++编写程序。当涉及到方法声明(以及许多其他事情)时,我是一无所知的。我怀疑纠正错误很简单,但我只是不知道如何纠正。

换句话说,我现在是RTFineM。我只是简单地复制和粘贴了上面的url中给出的示例,并遇到了两个问题。首先,它抱怨一些被反对的东西,但是简单的定义就解决了这个问题。其次,它抱怨不能像标题中所说的那样将一种类型转换成另一种类型。

导致问题的RunFunc类声明如下:

代码语言:javascript
复制
 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的声明如何才能正确编译和运行?

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-03-14 15:35:57

在这个构造函数中

代码语言:javascript
复制
   RunFunc(Func func,int o):m_Func(func),m_o(o)
   {

   };

prameter Func func由编译器调整为Func *func类型。另一方面,数据成员m_Func被声明为引用类型。

代码语言:javascript
复制
Func& m_Func;

错误信息说明了类型的不兼容性。

C2440不能从“_cdecl*(Int)”转换为“_cdecl&(Int)”

尝试声明构造函数如下

代码语言:javascript
复制
   RunFunc(Func &func,int o):m_Func(func),m_o(o)
   {

   };

或声明数据成员如下

代码语言:javascript
复制
Func *m_Func;

而不改变构造函数。

这里有两个演示程序

代码语言:javascript
复制
#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;
}

代码语言:javascript
复制
#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
EN

Stack Overflow用户

发布于 2018-03-14 15:40:03

在您的代码中,您将键入绑定对临时引用的引用,即复制传递给构造函数的参数。您可以尝试运行以下代码片段来查看两者之间的差异:

代码语言:javascript
复制
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;
}
票数 1
EN

Stack Overflow用户

发布于 2018-03-14 15:46:04

这是一种遗留的方法。您可以使用标准库函子和粘结剂。例如:

代码语言:javascript
复制
#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;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49281777

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档