@ Firas уже ответил на ваш первый вопрос, поэтому я не буду повторять это здесь.
Ваш второй вопрос предупреждает вас об этом:
friend std::ostream &operator<<(std::ostream &out, const Point<T> &T);
Это объявление в шаблоне класса:
template <class T>
class Point { // ...
Он говорит вам, что даже если вы можете создать экземпляр Point
для множества различных типов, вы говорите, что non -темплет operator<<
является другом для всех из них. То есть, хотя существует потенциально неограниченный набор различных типов Point
с, вы сказали, что для них есть только один operator<<
.
На самом деле, это кажется ошибкой в вашем коде - вы определили operator<<
как шаблон функции, но объявили функцию (не шаблонную) как друг класса (тот, которого ваш код, похоже, не определяет). IOW, это определение:
template <class T>
std::ostream &operator<<(std::ostream &out, const Point<T> &T)
... относится к шаблону, который не - это то же самое, на которое вы указали в объявлении друга выше (хотя я думаю, что вы намеревались сопоставить их).