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

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

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

20
задан BЈовић 17 January 2012 в 07:31
поделиться