Я не знаю, как вам удалось скомпилировать это с помощью g ++ (и я действительно сомневаюсь в этом), но ваш код действительно не компилируется по довольно очевидным причинам.Ваш класс Bar
предоставляет только один operator *
Bar& operator * (const Bar& boo)
, и этот оператор ожидает объект Bar
в качестве операнда правого размера.3
не будет работать, 3
не Bar
и не может быть преобразовано в Bar
.
Базовый класс operator *
- это тот, который мог бы работать здесь, но он скрытоператор производного класса.Вот почему, как и следовало ожидать, удаление производного класса operator *
избавляет от ошибки.
Вы можете просто добавить
using Foo<T, Bar<T> >::operator *;
к определению Bar
вОтобразите оператор базового класса, и он должен скомпилироваться.