Перегрузка оператора друга шаблона C++

что не так с моим кодом?

template<int E, int F>
class Float
{
 friend Float<E, F> operator+ (const Float<E, F> &lhs, const Float<E, F> &rhs);
};

G++ просто держит предупреждение:

float.h:7: warning: friend declaration ‘Float<E, F> operator+(const Float<E, F>&, const Float<E, F>&)’ declares a non-template function

float.h:7: warning: (if this is not what you intended, make sure the function template has already been declared and add <> after the function name here) -Wno-non-template-friend disables this warning

пробовал add <> after the function name here как упоминалось в предупреждении, но g++ дает мне ошибку.

я скомпилировал код с clang++, все было в порядке, никакого предупреждения вообще.

3 ответов


это просто предупреждение о сложном аспекте языка. При объявлении нет operator+. (Извините, надуманный пример.) Вы хотите положиться на operator+(Float const&, Float const&) для Bignum дополнительно. Теперь my_bignum + 3 не будет компилироваться, потому что ни один из операндов не является Float поэтому он не может найти


Это довольно старая тема, но я думаю, что самый простой способ объявить оператор, чтобы определить его внутри класса float.

template<int E, int F>
class Float
{
public:
    friend Float operator+ (const Float &lhs, const Float &rhs)
    {
        // Whatever you need to do.
    }
};

синтаксис легче писать и понимать, и он будет работать точно так же (за исключением того, что он будет встроен), он не будет функцией-членом.

MSDN: функции Friend, определенные внутри объявлений классов, не рассматриваются в области заключающего класса; они находятся в области файла.


вам нужно сделать именно так, как предупреждения говорят:

template<int E, int F>
Float<E, F> operator+ (const Float<E, F> &lhs, const Float<E, F> &rhs);

template<int E, int F>
class Float
{
 friend Float<E, F> operator+<> (const Float<E, F> &lhs, const Float<E, F> &rhs);
};

это объявляет полную специализацию шаблона оператора другом определенного экземпляра шаблона класса. В комментарии к вопросу UncleBens любезно предоставил ссылка на объяснение почему это так сложно.