Dear all,

I am fighting since some hours on migrating a libev C to a C++
implementation. For some unknown reasons, Visual Studio accepts a simple
function setting (ev::io iow; iow.set<io_cb_1>();), but not method settings
(iow2.set<myclass, &myclass::io_cb_2>(&Cobj) ;) !! VS does the same error
code on different VS version!

I fixed the VS compiling problem by either removing a method on ev++.h what
it seems to be a double declaration troubling the visual compiler or by
either modifying the no-argument callback method as showed below... But I
have no idea if this is what I have to do and if it will not create problem
later on!

from
void set (K *object) throw (){....}
to
void set () throw (){....}

should we then set a null instead of object ?

    // no-argument callback
    template <
        class K,
        void (K::*method)()>
    void set () throw ()
    {
      set_ (NULL, method_noargs_thunk<K, method>);
    }

Any feedbacks are welcomed warmly!

Many Thanks,
Rémi

//////////// from ev++.h /////////////////////////////
......
    template<class K, void (K::*method)(watcher &w, int)>
    static void method_thunk (EV_P_ ev_watcher *w, int revents)
    {
      (static_cast<K *>(w->data)->*method)
        (*static_cast<watcher *>(w), revents);
    }

#if 0
    // no-argument callback
    template <
        class K,
        void (K::*method)()>
    void set (K *object) throw ()
    {
      set_ (object, method_noargs_thunk<K, method>);
    }
#endif //0

    template<class K, void (K::*method)()>
    static void method_noargs_thunk (EV_P_ ev_watcher *w, int revents)
    {
      (static_cast<K *>(w->data)->*method)
        ();
    }
..........
//////////////////////////////////////////////////////////////////////

///////////////////////////////// THE PROG
/////////////////////////////////////////////////////////
#include "ev++.h"
#include <iostream>

#ifdef WIN32

#include <winsock2.h>
#include <io.h>    //i.e. _open_osfhandle()
#include <fcntl.h> //i.e. _O_RDWR
#define FD_TO_SOCKET(fd)   ((SOCKET) _get_osfhandle ((fd)))
#define SOCKET_TO_FD(fd)   (_open_osfhandle (fd ,_O_RDWR)) //both read and
write
#define CLOSE_FD(fd)   _close(fd)

#else // not WIN32

#include <sys/types.h>
#include <sys/socket.h>
......
#endif //WIN32

class myclass
{
public:
    ev::io   io;
    void io_cb_2(ev::io   &w, int revents) {};

    myclass (int fd)
    {
    }
};


void io_cb_1 (ev::io &w, int revents) { }

int main()
{
    SOCKET fd;
    fd = ::socket(AF_INET, SOCK_STREAM, 0);
    int fd_type = SOCKET_TO_FD(fd);

    //type 1! // OK on Visual Studio, Cygwin and Linux
    ev::io iow;
    iow.set<io_cb_1>();
    iow.start();

    //type 2! KO on Visual Studio and OK on Cygwin and Linux
    ev::io iow2;
    myclass Cobj(fd_type);
    iow2.set<myclass, &myclass::io_cb_2>(&Cobj) ;
    iow2.start(fd_type, ev::READ);

    std::cout << "coucou 3" << std::endl;
    return 0;
}



/////////////////////////////// THE ERROR ON
VISUAL//////////////////////////////////////////////////////////////////////
1>Compiling...
1>mainCall.cpp
1>d:\developements\egox_ref\projects\libev++\ev++.h(357) : warning C4290:
C++ exception specification ignored except to indicate a function is not
__declspec(nothrow)
1>d:\developements\egox_ref\projects\libev++\ev++.h(381) : warning C4290:
C++ exception specification ignored except to indicate a function is not
__declspec(nothrow)
1>d:\developements\egox_ref\projects\libev++\ev++.h(813) : warning C4800:
'volatile sig_atomic_t' : forcing value to bool 'true' or 'false'
(performance warning)
1>d:\developements\egox_ref\projects\libev++\maincall.cpp(123) : error
C2440: 'specialization' : cannot convert from 'void (__thiscall myclass::*
)(ev::io &,int)' to 'void (__thiscall myclass::* const )(void)'
1>        Types pointed to are unrelated; conversion requires
reinterpret_cast, C-style cast or function-style cast
1>d:\developements\egox_ref\projects\libev++\maincall.cpp(123) : error
C2973: 'ev::base<ev_watcher,watcher>::set' : invalid template argument 'void
(__thiscall myclass::* )(ev::io &,int)'
1>        with
1>        [
1>            ev_watcher=ev_io,
1>            watcher=ev::io
1>        ]
1>        d:\developements\egox_ref\projects\libev++\ev++.h(493) : see
declaration of 'ev::base<ev_watcher,watcher>::set'
1>        with
1>        [
1>            ev_watcher=ev_io,
1>            watcher=ev::io
1>        ]
1>d:\developements\egox_ref\projects\libev++\maincall.cpp(123) : error
C2668: 'ev::io::set' : ambiguous call to overloaded function
1>        d:\developements\egox_ref\projects\libev++\ev++.h(468): could be
'void ev::base<ev_watcher,watcher>::set<myclass,void myclass::io_cb_2(ev::io
&,int)>(K *) throw()'
1>        with
1>        [
1>            ev_watcher=ev_io,
1>            watcher=ev::io,
1>            K=myclass
1>        ]
1>        d:\developements\egox_ref\projects\libev++\ev++.h(493): or 'void
ev::base<ev_watcher,watcher>::set<myclass,void myclass::io_cb_2(ev::io
&,int)>(K *) throw()'
1>        with
1>        [
1>            ev_watcher=ev_io,
1>            watcher=ev::io,
1>            K=myclass
1>        ]
1>        while trying to match the argument list '(myclass *__w64 )'
1>Build log was saved at
"file://d:\Developements\egoX_ref\projects\libev++\Debug\BuildLog.htm"
1>libev++ - 3 error(s), 3 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
_______________________________________________
libev mailing list
libev@lists.schmorp.de
http://lists.schmorp.de/cgi-bin/mailman/listinfo/libev

Reply via email to