簡體   English   中英

C2440無法從'void(_cdecl *)(int)'轉換為'void(_cdecl&)(int)

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

我正在Visual Studio 2017純模式下使用C ++,並且嘗試編譯和運行在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的聲明?

謝謝,非常感謝您的幫助。

在這個構造函數中

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

在您的代碼中,您想綁定對臨時對象的引用,即傳遞給構造函數的參數的副本。 您可以嘗試運行以下代碼片段以查看區別:

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

這是傳統方法。 您可以改用標准庫函子和活頁夾 例如:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM