VC++进行CLR编程,说null是“未声明的标识符”

foe_exile 2008-11-24 12:34:29
问题1:
VC++进行CLR编程,说null是“未声明的标识符”,请高手救命,应该怎么解决啊?
问题2:
有一行代码:
AsyncCallback^ beginConnectCallBack = gcnew AsyncCallback(&P2PMultiChat::P2PSock::ConnectCallBack);
另外有ConnectCallBack的声明:
namespace
{
public ref class P2PSock
{
private:
Void ConnectCallBack(IAsyncResult^ ar);
}
}
VS2008给出的错误是:
error C3352: “void P2PMultiChat::P2PSock::ConnectCallBack(System::IAsyncResult ^)”: 指定的函数与委托类型“void (System::IAsyncResult ^)”不匹配
可是我怎么看就是怎么匹配啊!我查了一些资料,MSDN上给的c#和VB的示例代码都用了static关键字来描述ConnectCallBack,但是我要使用非静态的ConnectCallBack啊,请高手救命!
...全文
1988 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
copy_zn 2012-05-23
  • 打赏
  • 举报
回复
缺少什么头文件啊
flyz1360 2011-11-27
  • 打赏
  • 举报
回复
同样的问题,发现是缺少头文件
mygisforum 2011-03-03
  • 打赏
  • 举报
回复
郁闷 看不懂!
djs82 2010-08-19
  • 打赏
  • 举报
回复
非常感谢楼主!
bigbaby6331 2010-05-25
  • 打赏
  • 举报
回复
谢谢楼主分享,这个问题困扰了我很久,太感谢了,不过这个托管C++真是很恼人啊
jjjlike 2008-12-06
  • 打赏
  • 举报
回复
up!
foe_exile 2008-11-25
  • 打赏
  • 举报
回复
解决了!查了大量的资料,再加上一些运气,找到了解决方案:
问题1解决方案:
vc++的CLR里使用nullptr,与VB里的nothing和c#里的等同。

问题2解决方案:
在创建实例委托时,有两种方法,参见示例:
delegate void SumDelegate();

public ref class X {
public:
void F() {}
static void F2() {}
};

int main() {
X ^ MyX = gcnew X();
SumDelegate ^ pSD = gcnew SumDelegate(); // C3350
SumDelegate ^ pSD1 = gcnew SumDelegate(MyX, &X::F);
SumDelegate ^ pSD2 = gcnew SumDelegate(&X::F2);
}

也即,在使用成员函数作为回调函数时,需要传入包含委托函数的类型的实例,因此,我问题的代码可以改为:
AsyncCallback^ beginConnectCallBack = gcnew AsyncCallback(this,&P2PSock::ConnectCallBack);
fibbery 2008-11-24
  • 打赏
  • 举报
回复
可能缺少头文件吧
hhyttppd 2008-11-24
  • 打赏
  • 举报
回复
据俺所知道用IAsyncResult*可以得到delegate对象的指针,用它调用你的非静态对象吧。


class MyDelegate
{
static void MyCallback( IAsyncResult^ ar )
{

// Obtains return value from the delegate call using EndInvoke.
AsyncResult^ aResult = dynamic_cast<AsyncResult^>(ar);
MyDelegate^ temp = static_cast<MyDelegate^>(aResult->AsyncDelegate);
temp->YourActualFuncToCall();
}
}

foe_exile 2008-11-24
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 fibbery 的回复:]
回调函数必须是:
static静态
全局函数
[/Quote]
必须是static的啊?这样很不方便诶,static就没有办法使用类中的非静态变量之类的啦,那位高手能够解决啊?
pushregistration 2008-11-24
  • 打赏
  • 举报
回复
不懂,up
android2008 2008-11-24
  • 打赏
  • 举报
回复
不懂,up
foe_exile 2008-11-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 elovenana 的回复:]
是不是null写成NULL就好了;要不然就是没有定义
AsyncCallback^ beginConnectCallBack = gcnew AsyncCallback
错误提示,说是gcnew AsyncCallback返回值是 void,你用AsyncCallback^ beginConnectCallBack=,是错误的;
做个转换(AsyncCallback^)gcnew AsyncCallback
[/Quote]
我用了null,NULL,Null都不行!
AsyncCallback^ beginConnectCallBack是定义一个委托,
Void ConnectCallBack(IAsyncResult^ ar); 才是委托函数
fibbery 2008-11-24
  • 打赏
  • 举报
回复
NULL
fibbery 2008-11-24
  • 打赏
  • 举报
回复
回调函数必须是:
static静态
全局函数
hhyttppd 2008-11-24
  • 打赏
  • 举报
回复
static,必须的!


长安宁 2008-11-24
  • 打赏
  • 举报
回复
是不是null写成NULL就好了;要不然就是没有定义
AsyncCallback^ beginConnectCallBack = gcnew AsyncCallback
错误提示,说是gcnew AsyncCallback返回值是 void,你用AsyncCallback^ beginConnectCallBack=,是错误的;
做个转换(AsyncCallback^)gcnew AsyncCallback
帅得不敢出门 2008-11-24
  • 打赏
  • 举报
回复
up下

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧