|
Boost : |
From: David Abrahams (dave_at_[hidden])
Date: 2004-06-30 06:55:14
"Peter Dimov" <pdimov_at_[hidden]> writes:
> David Abrahams wrote:
>> Michael Glassford <glassfordm_at_[hidden]> writes:
>>
>>>> Also, going back to the struct technique, do the struct instances
>>>> need to be in an anonymous namespace to prevent ODR violations? Just
>>>> trying to get my head around the concept.
>>>
>>> Probably they should be in a separate namespace, though possibly not
>>> anonymous.
>>
>> Anonymous namespaces in header files *cause* ODR violations. Not sure
>> how they can be used to prevent ODR violations.
>>
>> Peter, are you planning to get the bind placeholders out of the
>> unnamed namespace?
>
> I'm not sure how the bind placeholders can cause ODR violations; could you
> elaborate?
Simple:
// f.hpp
template <class S, class T>
bool f(S const& s, T const& x)
{
return std::find_if(
s.begin(), s.end()
, boost::bind(std::less<T>(), _1, x)) != s.end();
}
// t1.cpp
#include "f.hpp"
#include <vector>
bool f1(std::vector<int> const& s, int x) { return f(s,x); }
// t2.cpp
#include "f.hpp"
#include <vector>
bool f2(std::vector<int> const& s, int x) { return f(s,x); }
f<std::vector<int>,int> refers to a different object when it names
"_1" in each translation unit.
> Anyway, I guess we'll have to migrate to TR1 style placeholders one
> day, but this will break existing code.
I'm not sure it has to:
namespace bind {
extern arg<1> _1;
}
namespace { // if you like
using bind::_1;
}
-- Dave Abrahams Boost Consulting http://www.boost-consulting.com
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk