I have some code in a header that looks like this:
#include class Thing; class MyClass { std::unique_ptr< Thing > my_thing; };
The full definition of the Thing is required at the point of template instantiation. This is the exact reason why the pimpl idiom compiles.
If it wasn't possible, people would not ask questions like this.