Класс шаблона функции друга
Я знаю два способа работы с функцией друга шаблонного класса.
Первый способ - сделать функцию friend встроенной:
заголовочный файл A. h
#ifndef A_H #define A_H #include<iostream> using namespace std; template <class T> class A { friend ostream& operator << (ostream& outs, const A<T>& object) { //definition goes here } //Other functions of class A } #endif //A_H
Файл реализации A.cpp
//the rest of the function definition of class A
Второй способ заключается в прямом объявлении класса А и функции друга, а затем вы помещаете определение функции друга и другие определения функций класса А в файл реализации
заголовочный файл A. h
#ifndef A_H #define A_H #include<iostream> using namespace std; template <class T> class A; template <class T> ostream& operator << (ostream& outs, const A<T>& object); class A { friend ostream& operator << <>(ostream& outs, const A<T>& object); //Other functions of class A } #endif //A_H
Файл реализации A.cpp
#ifndef A.CPP #define A.CPP //the friend function definition and other function definitions #endif //A.CPP
Чего я не понимаю, так это того, что в обычных классах вы всегда можете определить функции друзей после определения классов. В классах шаблонов вы должны либо определить функцию друга внутри класса шаблона, либо объявить функцию друга вперед. Есть ли этому объяснение?
Что я уже пробовал:
Это единственные два способа, которые я знаю. Может ли кто-нибудь объяснить, как они работают и есть ли другой способ?