That's because you let the compiler generate the default constructor for `CollisionFilter` in its header. At this point, the compiler doesn't know how to destroy `CollisionFilter::Implementation` (its destructor might even be private, after all), so the auto-generated default constructor would be ill-formed.

You would get the same error when using a `unique_ptr` for the collision filter or even a manual `delete` in the system's destructor. It's practically a forced memory leak.

Just declare the destructor in the header and define it in the source file, as described in the styleguide and everything should be fine.