On Tue, 2013-05-28 at 14:39 +0000, Steve Huston wrote:
> Hi Ales,
> 
> The IOHandle conversion comes from this method on Socket:
> 
> virtual operator const IOHandle&() const = 0;
> 
> I've been having problems with this type of thing trying to get Qpid building 
> XL C++ 11 too, so I'm not sure you'd be in much better shape with an updated 
> compiler :-(
> 
> Try putting a cast to const IOHandle& - let us know how that goes.

That conversion operator was put in because in a previous design Socket
did in fact extend IOHandle. But upon some refactoring that seemed like
a bad idea - it isn't obvious that 'Socket "is a" IOHandle' makes a lot
more sense than 'Socket "has a" IOHandle'. Given that aggregation
generally causes less coupling than inheritance I think it is a better
design, so I changed it and added the conversion operator to deal with
any code that still needed to do the conversion.

All of which is long winded explanation to say it would be better to
make the conversion explicit and to add:
        virtual const IOHandle& getIOHandle() const = 0;
Obviously this may cause some knock-on changes throughout the code base,
but I suspect not too many.

Try this and see if it helps your situation. if so changing Socket in
this way seems like a good idea to me.

Andrew

> 
> -Steve
> 
> > -----Original Message-----
> > From: Aleš Trček [mailto:[email protected]]
> > Sent: Monday, May 27, 2013 8:09 PM
> > To: [email protected]
> > Subject: Building qpid C++ broker on AIX
> > 
> > Hi all,
> > 
> > Since I obviously won't succeed with this so easily, I'm opening a thread on
> > the subject. Many thanks to all who can help me.
> > 
> > System with AIX 5.3 / xlC 9.0 (yeah old as sh*t, but I can't do anything 
> > about
> > that soon) and Boost 1.34, building qpidc-0.20.
> > Anyway, I managed to go over some obstacles so far, but currently I'm stuck
> > with the following error(s):
> > [ 20%] Building CXX object
> > src/CMakeFiles/qpidcommon.dir/qpid/sys/posix/AsynchIO.o
> > "/achinst/atk/qpid_build/qpidc-0.20/src/qpid/sys/posix/AsynchIO.cpp", line
> > 96.5: 1540-0218 (S) The call does not match any parameter list for
> > "DispatchHandle::DispatchHandle".
> > "/achinst/atk/qpid_build/qpidc-0.20/src/qpid/sys/DispatchHandle.h", line
> > 88.24: 1540-1283 (I) "qpid::sys::DispatchHandle::DispatchHandle(const
> > qpid::sys::IOHandle &, Callback, Callback, Callback)" is not a viable 
> > candidate.
> > "/achinst/atk/qpid_build/qpidc-0.20/src/qpid/sys/posix/AsynchIO.cpp", line
> > 96.12: 1540-0256 (I) A parameter of type "const qpid::sys::IOHandle &"
> > cannot be initialized with an expression of type "const qpid::sys::Socket".
> > "/achinst/atk/qpid_build/qpidc-0.20/src/qpid/sys/posix/AsynchIO.cpp", line
> > 168.5: 1540-0218 (S) The call does not match any parameter list for
> > "DispatchHandle::DispatchHandle".
> > "/achinst/atk/qpid_build/qpidc-0.20/src/qpid/sys/DispatchHandle.h", line
> > 88.24: 1540-1283 (I) "qpid::sys::DispatchHandle::DispatchHandle(const
> > qpid::sys::IOHandle &, Callback, Callback, Callback)" is not a viable 
> > candidate.
> > "/achinst/atk/qpid_build/qpidc-0.20/src/qpid/sys/posix/AsynchIO.cpp", line
> > 168.20: 1540-0256 (I) A parameter of type "const qpid::sys::IOHandle &"
> > cannot be initialized with an expression of type "const qpid::sys::Socket".
> > "/achinst/atk/qpid_build/qpidc-0.20/src/qpid/sys/posix/AsynchIO.cpp", line
> > 306.5: 1540-0218 (S) The call does not match any parameter list for
> > "DispatchHandle::DispatchHandle".
> > "/achinst/atk/qpid_build/qpidc-0.20/src/qpid/sys/DispatchHandle.h", line
> > 88.24: 1540-1283 (I) "qpid::sys::DispatchHandle::DispatchHandle(const
> > qpid::sys::IOHandle &, Callback, Callback, Callback)" is not a viable 
> > candidate.
> > "/achinst/atk/qpid_build/qpidc-0.20/src/qpid/sys/posix/AsynchIO.cpp", line
> > 306.20: 1540-0256 (I) A parameter of type "const qpid::sys::IOHandle &"
> > cannot be initialized with an expression of type "const qpid::sys::Socket".
> > 
> > So, DispatchHandle has a constructor:
> > QPID_COMMON_EXTERN DispatchHandle(const IOHandle& h, Callback rCb,
> > Callback wCb, Callback dCb);
> > 
> > which takes IOHandle& as the first parameter, however in AsynchIO, the
> > constructor is called with the qpid::sys::Socket e.g:
> > AsynchAcceptor::AsynchAcceptor(const Socket& s, AsynchAcceptor::Callback
> > callback) :
> >     acceptedCallback(callback),
> >     handle(s, boost::bind(&AsynchAcceptor::readable, this, _1), 0, 0),
> >     socket(s)
> > 
> > (Member "handle" is of type DispatchHandle.)
> > 
> > The thing is, IOHandle and Socket are totally unrelated. For this to ever 
> > work,
> > Socket would need to extend IOHandle (or one of its derived classes). So the
> > question is, how does this compile anywhere? :)
> > 
> > Regards,
> > Ales
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
> 



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to