// PR c++/21682
template <class T>
struct t
{
  typedef typename T::type type;
};
template<> class t<int>{};
template <class T> struct t1{ };
template<> struct t1<int>
{
  typedef int type;
};
namespace name1
{
  template <class S> typename t<S>::type begin(S const& s);
  namespace name2
  {
    template <class S> typename t1<S>::type begin(S const& s);
  }
  using name2::begin;
}
/* Test calling the function. */
int f(int a) { return name1::begin(a); }
struct aa { typedef double type; };
double g(aa t) { return name1::begin(t); }