// Boost.Range library // // Copyright Thorsten Ottosen 2003-2004. Use, modification and // distribution is 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) // // For more information, see http://www.boost.org/libs/range/ // #include namespace A { namespace detail { template< typename T > int f( const T& x ) { // Default: std::cout << 1 << std::endl; return 1; } template< typename T > int adl_f2( const T& x, int* ) { return f( x ); } template< typename T > int adl_f( const T& x ) { return adl_f2( x, 0 ); } } template< typename T > int f( const T& x ) { return detail::adl_f( x ); } template< typename T > int adl_f2( const T& x, int ) { return detail::f( x ); } //-------------------------------- class C {}; /* // Optional: int f( const C& x ) { std::cout << 2 << std::endl; } */ template< typename T > class D {}; /* // Optional: template< typename T > int f( const D< T >& x ) { std::cout << 3 << std::endl; } */ } namespace B { class C {}; // Optional: /* int f( const C& ) { std::cout << 4 << std::endl; } */ template< typename T > class D {}; /* // Optional: template< typename T > int f( const D< T >& x ) { std::cout << 5 << std::endl; } */ } int main() { A::f( 42 ); A::C ac; A::f( ac ); A::D< int > ad; A::f( ad ); B::C bc; A::f( bc ); B::D< int > bd; A::f( bd ); }