gcc refuses to use scoped_ptr on incomplete type, so let ImplPtr