ducdohuunguyen Ответов: 1

Класс шаблона функции друга


Я знаю два способа работы с функцией друга шаблонного класса.
Первый способ - сделать функцию 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


Чего я не понимаю, так это того, что в обычных классах вы всегда можете определить функции друзей после определения классов. В классах шаблонов вы должны либо определить функцию друга внутри класса шаблона, либо объявить функцию друга вперед. Есть ли этому объяснение?

Что я уже пробовал:

Это единственные два способа, которые я знаю. Может ли кто-нибудь объяснить, как они работают и есть ли другой способ?

1 Ответов

Рейтинг:
7

Richard MacCutchan

Причина в том, что шаблон не является определением класса, это шаблон, который используется для создания определения класса. Это происходит только тогда, когда вы объявляете фактический класс, который включает в себя объявление типа (T) действительно ли компилятор создает определение класса. Если объявление friend находится вне класса, то нет никакой гарантии, что тип будет соответствовать тому, что было объявлено в классе.