Перегрузка оператора друга шаблона 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 любезно предоставил ссылка на объяснение почему это так сложно.