朋友,模板,重载<<

Cry*_*tal 5 c++ templates friend

我正在尝试使用友元函数来重载 << 和模板以熟悉模板。我不知道这些编译错误是什么:

Point.cpp:11: error:  shadows template parm 'class T'
Point.cpp:12: error: declaration of 'const Point<T>& T'
Run Code Online (Sandbox Code Playgroud)

对于这个文件

#include "Point.h"

template <class T>
Point<T>::Point() : xCoordinate(0), yCoordinate(0)
{}

template <class T>
Point<T>::Point(T xCoordinate, T yCoordinate) : xCoordinate(xCoordinate), yCoordinate(yCoordinate)
{}

template <class T>
std::ostream &operator<<(std::ostream &out, const Point<T> &T)
{
    std::cout << "(" << T.xCoordinate << ", " << T.yCoordinate << ")";
    return out;
}
Run Code Online (Sandbox Code Playgroud)

我的标题看起来像:

#ifndef POINT_H
#define POINT_H

#include <iostream>

template <class T>
class Point
{
public:
    Point();
    Point(T xCoordinate, T yCoordinate);
    friend std::ostream &operator<<(std::ostream &out, const Point<T> &T);

private:
    T xCoordinate;
    T yCoordinate;
};

#endif
Run Code Online (Sandbox Code Playgroud)

我的标题也给出了警告:

Point.h:12: warning: friend declaration 'std::ostream& operator<<(std::ostream&, const Point<T>&)' declares a non-template function
Run Code Online (Sandbox Code Playgroud)

我也不确定为什么。有什么想法吗?谢谢。

Fir*_*aad 3

模板参数和函数参数具有相同的名称。将其更改为类似以下内容:

template <class T>
std::ostream &operator<<(std::ostream &out, const Point<T> &point)
{
    std::cout << "(" << point.xCoordinate << ", " << point.yCoordinate << ")";
    return out;
}
Run Code Online (Sandbox Code Playgroud)

标头中友元函数的声明也应该更改:

template <class G>
friend std::ostream &operator<<(std::ostream &out, const Point<G> &point);
Run Code Online (Sandbox Code Playgroud)