![](/img/trans.png)
[英]error C2440: '=' : cannot convert from 'char *(__cdecl *)(int,int)' to en 'GetItemText_t'
[英]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.