https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97174
Jonathan Wakely <redi at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Severity|normal |enhancement --- Comment #3 from Jonathan Wakely <redi at gcc dot gnu.org> --- Right, the redefinition is dependent and we don't check it until instantiation. That's allowed by the standard. Reduced: template<typename T> struct make_dependent { using type = T; }; template<typename T> using make_dependent_t = typename make_dependent<T>::type; namespace N { template <typename T> make_dependent_t<T> conv (T); } template <typename T> long N::conv (T val) { return static_cast<long>(val); } Or simply: template<typename T> struct make_dependent { using type = T; }; template<typename T> using make_dependent_t = typename make_dependent<T>::type; template <typename T> make_dependent_t<T> conv (T); template <typename T> long ::conv (T val) { return static_cast<long>(val); }