I’m using the pimpl-idiom with std::unique_ptr:
class window {
window(const rectangle& rect);
private:
class window_impl; // defined elsewhere
std::unique_ptr<window_impl> impl_; // won't compile
};
However, I get a compile error regarding the use of an incomplete type, on line 304 in <memory>:
Invalid application of ‘
sizeof‘ to an incomplete type ‘uixx::window::window_impl‘
For as far as I know, std::unique_ptr should be able to be used with an incomplete type. Is this a bug in libc++ or am I doing something wrong here?
Here are some examples of
std::unique_ptrwith incomplete types. The problem lies in destruction.If you use pimpl with
unique_ptr, you need to declare a destructor:because otherwise the compiler generates a default one, and it needs a complete declaration of
foo::implfor this.If you have template constructors, then you’re screwed, even if you don’t construct the
impl_member:At namespace scope, using
unique_ptrwill not work either:since the compiler must know here how to destroy this static duration object. A workaround is: