Проблема в том, что operator ->
должен возвращать указатель , а не ссылку . Идея состоит в том, что operator ->
должен возвращать указатель на реальный объект, к которому должен быть применен указатель. Например, для класса с перегруженным operator ->
, код
myClass->myValue;
переводится в
(myClass.operator-> ())->myValue;
Проблема с вашим кодом в том, что operator ->
возвращает ссылку, поэтому пишите
myClass.operator->().f();
совершенно законно, потому что вы явно вызываете оператор, но пишете
myClass->f();
недопустимо, потому что компилятор пытается расширить его до
myClass.operator->()->f();
и тип возвращаемого значения operator->
не является указателем.
Чтобы исправить это, измените код так, чтобы вы возвращали указатель в operator ->
. Если вы хотите перегрузить оператор для возврата ссылки, перегрузите operator *
; Разыменование указателя действительно должно давать ссылки.