std::unique_ptr
(и std::shared_ptr
) имеет свой собственный operator->
для возврата указателя, который он держит.
Ваш ошибочный код, по сути, делает это:
auto wrapper = std::make_unique<Wrapper>();
//wrapper->doSomething();
Wrapper *ptr = wrapper.operator->();
ptr->doSomething(); // ERROR!
Действительно, в вашем классе Wrapper
нет метода doSomething()
.
Чтобы сделать то, что вы пытаетесь, вам нужно разыменовать указатель Wrapper*
для доступа к фактическому Wrapper
объект, то вы можете вызвать его собственный operator->
для доступа к его указателю Implementation*
, например:
auto wrapper = std::make_unique<Wrapper>();
(*wrapper)->doSomething();
, который в основном делает это:
auto wrapper = std::make_unique<Wrapper>();
//(*wrapper)->doSomething();
Wrapper &ref = wrapper.operator*();
Implementation *impl = ref.operator->();
impl->doSomething(); // OK!