|
Boost : |
From: Peter Dimov (pdimov_at_[hidden])
Date: 2004-11-29 17:54:59
David Abrahams wrote:
> Peter, I've been expecting for some time that you were going to put
> the placeholders in a sub-namespace of boost, if only to avoid the ODR
> violations it is currently causing. No?
Correct me if I'm wrong, but the ODR violations are caused by the use of an
unnamed namespace; this is not related to whether the placeholders are in a
subnamespace of boost. It seems to me that Lambda's placeholders should be
susceptible to the same sort of ODR violations. (I know that I asked you for
an ODR/_1 example once and you provided it, but I don't remember what it was
and can't find it at the moment. Sorry.)
> The fact that I have to write mpl::_1 just to avoid colliding with
> <unnamed>::_1 is disconcerting at best. If another library came along
> and did what boost/bind/placeholders.hpp does, it would cause a clash.
First mover advantage, you know. (Kidding.)
> My suggestion, assuming you care about backwards compatibility, is:
>
> boost/bind/placeholders.hpp
>
> declares placeholders in namespace boost::bind::placeholders.
But does not _define_ them? (I had boost::placeholders in mind for a
namespace, consistent with std::tr1::placeholders; when you use 'boost' as a
substitute for 'std::tr1', boost::bind::placeholders won't work.)
> boost/bind/bind.hpp
>
> has the current contents of boost/bind.hpp, except that
> placeholders are not declared in the <unnamed>::
>
> boost/bind.hpp
>
> #include <boost/bind/bind.hpp>
> #include <boost/bind/placeholders.hpp>
> namespace { using namespace boost::bind::placeholders; }
Hm. What is the difference between this directive and the simple
using namespace boost::bind::placeholders;
? I can't think of any.
This, of course, will still require you to use mpl::_1. I assume that you
intend to fix all your includes to belong to... err, point to the
using-directive-less version?
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk