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

Я прочитал пару вопросов относительно моей проблемы на StackOverflow.com, и, похоже, ни один из них не решил мою проблему. А может, я ошибся ... Перегруженный << работает, если я превращаю его во встроенную функцию. Но как мне заставить его работать в моем случае?

предупреждение: объявление друга std :: ostream & operator << (std :: ostream &, const D &) 'объявляет предупреждение не-шаблонной функции

: (если это не то, что вы намеревались сделать, убедитесь, что шаблон функции уже объявлен, и добавьте <> после имени функции здесь) -Wno-non-template-friend отключает это предупреждение

/tmp/cc6VTWdv.o:uppgift4 .cc :(. text + 0x180): неопределенная ссылка на оператор << (std :: basic_ostream > &, D const &) ' collect2: ld возвратил 1 статус выхода

Код:

template <class T>
T my_max(T a, T b)
{
   if(a > b)      
      return a;
   else
      return b;
}

template <class classT>
class D
{
public:
   D(classT in)
      : d(in) {};
   bool operator>(const D& rhs) const;
   classT operator=(const D<classT>& rhs);

   friend ostream& operator<< (ostream & os, const D<classT>& rhs);
private:
   classT d;
};


int main()
{

   int i1 = 1;
   int i2 = 2;
   D<int> d1(i1);
   D<int> d2(i2);

   cout << my_max(d1,d2) << endl;
   return 0;
}

template <class classT>
ostream& operator<<(ostream &os, const D<classT>& rhs)
{
   os << rhs.d;
   return os;
}
56
задан Eric Schmidt 4 November 2018 в 10:01
поделиться