
Joseph Gauterin wrote:
As discussed previously on the mailing list with David Abrahams and Steve Watanabe, I've written a swap function for boost which uses argument dependent lookup (aka koenig lookup) [...]
Looks nice! Please note that there's a bug in your test, "specialized_in_std.cpp", as it says: namespace std { void swap(swap_test_class& left, swap_test_class& right) { left.swap(right); } } The C++ Standard does not allow you to add your own overload of swap to the std namespace. Quoting the latest Draft (N2315, [reserved.names]): "It is undefined for a C++ program to add declarations or definitions to namespace std ..." But I guess you know about this already, and you intended to do a template specialization of std::swap, right? Also note that your boost::swap may not work properly on ConceptGCC. I tried the following test program, using the BoostCon Edition of ConceptGCC, from http://www.generic-programming.org/software/ConceptGCC/download.php //////////////////////////////////////////////////////////// #include <boost/utility/swap.hpp> #include <boost/utility.hpp> // Foo is non-copyable, but still it is swappable! class Foo: boost::noncopyable { int m_data; public: Foo() : m_data(0) {} void swap(Foo & arg) { std::swap(this->m_data, arg.m_data); } }; void swap(Foo & arg1, Foo & arg2) { arg1.swap(arg2); } int main(int, char*[]) { Foo object1; Foo object2; boost::swap(object1,object2); return 0; } //////////////////////////////////////////////////////////// In this case, boost::swap should call the swap(Foo &, Foo &) function that I put into the global namespace, right? Instead, ConceptGCC (BoostCon) rejects the program, saying: noncopyable.hpp: In member function 'Foo& Foo::operator=(const Foo&)': noncopyable.hpp:28: error: 'const boost::noncopyable_::noncopyable& boost::noncopyable_::noncopyable::operator=(const boost::noncopyable_::noncopyable&)' is private libs/utility/swap/test/niels_test.cpp:5: error: within this context utility/swap.hpp: At global scope: utility/swap.hpp:20: note: synthesized method 'Foo& Foo::operator=(const Foo&)' first required here Actually Douglas Gregor already has a plan on how to fix this issue: http://conceptgcc.wordpress.com/2007/01/02/revisiting-name-lookup-with-the-s... So I guess in the future your boost::swap will work fine with ConceptGCC as well. :-) Kind regards, Niels -- Niels Dekker http://www.xs4all.nl/~nd/dekkerware Scientific programmer at LKEB, Leiden University Medical Center