Я пытаюсь получить функцию друга внутри шаблона, чтобы компилировать, но сообщение об ошибке и предупреждение я не понимаю. Я сделал демонстрацию проблемы. Ошибка я получаю:Templated Class Friend Operator Member Function
prog.cpp:8:57: error: non-class, non-variable partial specialization C operator+(const B& lhs, const C& rhs);
prog.cpp:15:59: warning: friend declaration 'C operator+(const B&, const C&)' declares a non-template function [-Wnon-template-friend] friend C operator+(const B& lhs, const C& rhs);
prog.cpp:15:59: note: (if this is not what you intended, make sure the function template has already been declared and add <> after the function name here)
#include <iostream>
using namespace std;
template<typename A, typename B>
class C;
template<typename A, typename B>
C<A, B> operator+<A, B>(const B& lhs, const C<A, B>& rhs);
template<typename A, typename B>
struct C
{
A val_;
C operator+(const C& other) const;
friend C<A, B> operator+(const B& lhs, const C<A, B>& rhs);
};
template<typename A, typename B>
C<A, B> C<A, B>::operator+(const C<A, B>& other) const
{
C<A, B> c;
c.val_ = this->val_ + other.val_;
return c;
}
template<typename A, typename B>
C<A, B> operator+(const B& lhs, const C<A, B>& rhs)
{
C<A, B> c;
c.val_ = lhs + rhs.val_;
return c;
}
int main()
{
C<string, char> c0,c1;
c0.val_ = " C0 ";
c1.val_ = " C1 ";
cout << "Stuct:" << (c0 + c1).val_ << '\n';
cout << "Friend:" << ('~' + c1).val_ << endl;
return 0;
}
Вам не нужно первое объявление 'оператора +', что неправильно. – Holt
Это пример проблемы. Мне нужно три формы в моем действительном коде: оператор C + (const C & other), оператор C + (const B & other) и оператор C (const B & lss, const C & rhs). Нотабене а не фактический компиляционный код, просто общие формы необходимости. – JadziaMD