In namespace std, of the gnu stdc++ header ostream, this is the definition of std::endl:
template<typename _CharT, typename _Traits>
inline basic_ostream<_CharT, _Traits>&
endl(basic_ostream<_CharT, _Traits>& __os)
{ return flush(__os.put(__os.widen('\n'))); }
Why is it possible to write std::cout << std::endl; where endl is used without template parameters?