Vzhledem k tomu, že op1 je typu MyClass, tak si jsem dost jistý, že změna operátoru na nečlenskou funkci neměla žádný podstatný význam. Ve skutečnosti problém pravděpodobně byl v tom, že třída MyClass musela mít definovanou automatickou konvezi na float. V takovém případě překladač při vyhodnocení výrazu
vysledek = op1 + op2;
nalezl 2 operátory: float + float a MyClass ₊ MyClass. Operandy pomocí automatických operací dokázal převést na oba, a protože v obou případech použil automatickou konverzi, nedokázal se pro žádný z nich rozhodnout. (Pokud by např. našel operátor, který konverzi nevyžaduje, tak by ho vesele použil.)
Převedení operátoru na nečlenskou funkci má význam pouze proto, abyste mohl napsat
vysledek = op2 + op1;
tzn. aby bylo možné aplikovat automatickou konverzi na levý operand. Jestli vám to nakonec začalo fungovat, tak to bylo skoro zaručeně tím, že jste odstanil některou automatickou konverzi: buď MyClass -> float nebo obráceně. Anebo jste možná operátor přetížil tak, že dokázal přijímat přímo floaty - pak by nepotřeboval automatickou konverzi a operátor by si dokázal vybrat. Jiné možné řešení (netvrdím, že doporučené) by bylo zcela odstanit operátor+ pro MyClass a nechat překladač vždy počítat ve floatech a převádět pomocí obou automatických koverzí tam a zpět.
Obecně takové praktické pravidlo v C++ džungli je "když už použiji automatickou konverzi (ono se to občas hodí), tak vždy ji mít pouze jedním směrem - buď jen tam, nebo jen zpět, ale nikdy obojí." Pokud mám konverzi oběma směry, musím být sakra opatrný. A popravdě, osobně jsem se ve své praxi setkal pouze s jedním případem, kdy to dávalo smysl.