Я хотел бы знать, почему неявное преобразование типов не работает с перегрузкой внешних операторов в шаблонах классов. Вот рабочая версия без шаблона:
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
С другой стороны, когда class 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) не может выполнить неявное преобразование типов с помощью конструктора преобразования для шаблонной версии класса. Это ожидаемое поведение? Есть ли какое-нибудь решение, кроме ручного создания всех необходимых перегрузок?