Неявное преобразование при перегрузке операторов для шаблонных классов

Я хотел бы знать, почему неявное преобразование типов не работает с внешней перегрузкой операторов в шаблонах классов. Вот рабочая версия без шаблонов:

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) не может выполнить неявное преобразование типов, используя конструктор преобразования для версии шаблона класса. Это ожидаемое поведение? Помимо ручного создания всех необходимых перегрузок, есть ли обходной путь для этого?

Ответы на вопрос(3)

Ваш ответ на вопрос