
"Peter Dimov" <pdimov@mmltd.net> writes:
David Abrahams wrote:
Michael Glassford <glassfordm@hotmail.com> 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