Я пытался написать другу оператор << в мой класс, и я получил это предупреждение излишним. И не могу понять, как это исправить. </p>
Заранее спасибо.
#include <iostream>
using namespace std;
template<class T>
class test
{
public:
explicit test(T a) noexcept : m_{ a } {}
template <class Y>
//line below shows that warning.
friend std::ostream& operator<<(std::ostream& out, const test<Y>& lhs);
private:
T m_;
};
template<class Y>
std::ostream& operator<<(std::ostream& out, const test<Y>& lhs)
{
out << lhs.m_ << endl;
return out;
}
int main()
{
test<int> p {25};
test<double> q {17.5};
std::cout << "By Friend " << p;
std::cout << "By Friend " << q;
return 0;
}
Редактировать 1
// Удален шаблон Y из оператора << в объявлении класса </p>
template<class T>
class test
{
public:
explicit test(T a) noexcept : m_{ a } {}
friend std::ostream& operator<< (std::ostream&, const test<T>&);
private:
T m_;
};
template<class T>
std::ostream& operator<<(std::ostream& out, const test<T>& lhs)
{
out << lhs.m_ << endl;
return out;
}
теперь я получил предупреждение
предупреждение: объявление друга 'std :: ostream & operator << (std :: ostream &, const test &)' объявляет не шаблонную функцию [-Wnon-template-friend] </p>
PS: в Visual Studio я получил ссылки об ошибках
РЕДАКТИРОВАТЬ 1,2 // редактирование сделано для EDIT 1
Я изменил Редактирование 1 следующим образом:
....
friend std::ostream& operator<< <> (std::ostream&, const test<T>&);
....
Значит, предупреждения и ссылки на ошибки устранены.