Я хотел бы знать, почему неявное преобразование типов не работает с перегрузкой внешнего оператора на шаблонах классов. Вот рабочая, неглавная версия:
class foo
{
public:
foo() = default;
foo(int that)
{}
foo& operator +=(foo rhs)
{
return *this;
}
};
foo operator +(foo lhs, foo rhs)
{
lhs += rhs;
return lhs;
}
Как и ожидалось, следующие строки компилируются правильно:
foo f, g;
f = f + g; // OK
f += 5; // OK
f = f + 5; // OK
f = 5 + f; // OK
С другой стороны, когда класс foo
объявляется как простой шаблон следующим образом:
template< typename T >
class foo
{
public:
foo() = default;
foo(int that)
{}
foo& operator +=(foo rhs)
{
return *this;
}
};
template< typename T >
foo< T > operator +(foo< T > lhs, foo< T > rhs)
{
lhs += rhs;
return lhs;
}
Следующие строки компилируются с ошибками:
foo< int > f, g;
f = f + g; // OK
f += 5; // OK
f = f + 5; // Error (no match for operator+)
f = 5 + f; // Error (no match for operator+)
Я хотел бы понять, почему компилятор (GCC 4.6.2) не может выполнить неявное преобразование типа, используя конструктор преобразования для версии шаблона класса. Это ожидаемое поведение? Помимо ручного создания всех необходимых перегрузок, существует ли какое-либо обходное решение для этого?