12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- // (C) Copyright John Maddock 2001.
- // Use, modification and distribution are subject to the
- // Boost Software License, Version 1.0. (See accompanying file
- // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- // See http://www.boost.org/libs/config for most recent version.
- // MACRO: BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL
- // TITLE: broken ADL
- // DESCRIPTION: Using declarations break argument dependent lookup
- // (probably Borland specific), the fix is to use
- // using namespace whatever; rather than
- // using whatever::symbol;.
- namespace boost_ns
- {
- template <class T>
- T* get_pointer(T* p)
- { return p; }
- namespace inner2
- {
- template <class T>
- struct X {};
- template <class T>
- T* get_pointer(X<T>)
- { return 0; }
- }
- }
- namespace user_ns
- {
- template <class T>
- struct Y{};
- template <class T>
- T* get_pointer(user_ns::Y<T>)
- { return 0; }
- template <class T>
- int f(T x)
- {
- // use this as a workaround:
- //using namespace boost;
- // this statement breaks ADL:
- using boost_ns::get_pointer; // conforming compilers require
- // this one to find the auto_ptr
- // and T* overloads
- return get_pointer(x) == 0;
- }
- }
- namespace boost_function_scope_using_declaration_breaks_adl{
- int test()
- {
- int i;
- typedef void* pv;
- i = user_ns::f(pv());
- i = user_ns::f(boost_ns::inner2::X<int>());
- (void)i;
- return 0;
- }
- }
|