Clang-Tidy: избыточная декларация оператора << - PullRequest
0 голосов
/ 13 ноября 2018

Я пытался написать другу оператор << в мой класс, и я получил это предупреждение излишним. И не могу понять, как это исправить. </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>&);
....

Значит, предупреждения и ссылки на ошибки устранены.

...