我使用snmp_pp.doc中的trap receiver 的例子,但是编译之后报以下的错误。清高手指教。error C2664: 
'int __thiscall Snmp::notify_register(const class SnmpCollection<class Oid> &,const class SnmpCollection<class CTarget> &,void (__cdecl *const )(int,class Snmp *,cl
ass Pdu &,class SnmpTarget &,void *),const void *)' : cannot convert parameter 3 from 'void (__cdecl *)(int,class Snmp *,class Pdu &,class TimeTicks &,class SnmpTarget &,void *)' to 'void (__cdecl *const )(int,class Snmp *,class Pdu &,class SnmpTarg
et &,void *)'        This conversion requires a reinterpret_cast, a C-style cast or function-style cast
Error executing cl.exe.

解决方案 »

  1.   

    传入的函数签名不对,改成要求的签名void (__cdecl *const )(int,class Snmp *,cl 
    ass Pdu &,class SnmpTarget &,void *)
      

  2.   

    我的使用的代码如下,一个callback函数my_trap_callback,之后传入notify_register(trapids, targets, &my_trap_callback).结果就出现了上面的错误。请问是不是我my_trap_callback有什么问题?void my_trap_callback ( int reason,                           // reason
                             Snmp* session,                   // session handle
                             Pdu & pdu,                         // trap pdu
                             TimeTicks &timestamp,     // timestamp
                             SnmpTarget &target,          // source of the trap
                             void * cbd)                         // optional callback data
    {
       GenAddress address;
       unsigned char get_cummunity[80], set_community[80];
       unsigned long timeout;
       int retry;
       unsigned char v=2;
       if(reason == SNMP_CLASS_NOTIFICATION)       target.resolve_to_C( OctetStr(get_cummunity,80),   // get community
                                OctetStr(set_community,80),    // set community
                                address,             // address object
                                timeout,               // timeout
                                retry, // retry
    v); //v1 or v2            //       cout << "Trap Received from:" 
    // << address->get_printable() 
    //    << "Trap Id = " 
    //    << trapid.get_printable();
    }
    Snmp *snmp;//---------------[ trap receive register ]---------------------------------------------------------------------
                                                       // dynamic Snmp object
    void trap_register()
    {
      int status;
       snmp = new Snmp( status);
       if (( snmp == NULL) || ( status != SNMP_CLASS_SUCCESS))
         cout <<"Error constructing Snmp Object\n";
       else
       {
          //-------[ set up two empty collections, empty denotes receive all ]-------------------------------
          TargetCollection targets;
          OidCollection trapids;
          //------[ invoke the regsiter ]----------------------------------------------------------------------------  //  snmp->notify_set_listen_port (162) ;   if(status = snmp->notify_register(trapids, targets, &my_trap_callback) != SNMP_CLASS_SUCCESS)
             cout <<"Snmp Trap Register Error " << snmp->error_msg(status);
       } }
      

  3.   

    OK!
    我终于自己找到问题了。
    在这里说明一下。是基本的回调函数应用的错误。我在trap_register() 中加了   snmp_callback p;        //snmp_callback 是snmp_pp.h中定义的函数指针
       p = my_trap_callback;   //把我定义的函数my_trap_callback的地址付给p把notify_register(trapids, targets, &my_trap_callback)中最后一个参数改为p.