Análisis de código fuente STL: prueba y comprensión del código de amigo de la plantilla de amigo enlazado

Propósito: Familiarizado con el código fuente de STL.
Recientemente leí el libro de análisis de código fuente de STL. Lo he leído antes, pero no experimenté con estos códigos yo mismo, así que puedo pensar que entiendo algunos conceptos, pero de hecho no los entiendo para nada... Por ejemplo, el siguiente fragmento de código es un extracto de mi propio libro. Uso la versión ubuntu 18.04 del compilador g++. Puede ser diferente para cada compilador, pero solo tengo una comprensión más profunda de la biblioteca STL y su uso.
Entre ellos se encuentran las funciones de amigo en la clase de plantilla y las funciones de sobrecarga de funciones de las funciones de amigo. El código y los resultados de la prueba se dan directamente a continuación, y daré mis propios puntos de vista más adelante.

#include<iostream>
#include<cstddef>

class alloc
{
    
    };

template <class T, class Alloc=alloc, size_t BufSiz=0>
class deque
{
    
    
	public:
		deque(){
    
    std::cout <<"deque"<<' ';}
};

template <class T, class Sequence>
class stack;

template <class T, class Sequence>
bool operator == (const stack<T, Sequence>& x, const stack<T, Sequence>& y);

template <class T, class Sequence>
bool operator < (const stack<T, Sequence>& x, const stack<T, Sequence>& y);

template <class T, class Sequence = deque<T>>
class stack
{
    
    
	friend bool operator ==  (const stack<T, Sequence>& x, const stack<T, Sequence>& y)
	{
    
    
		std::cout << "operator == " << '\t';
		return true;
	}
	friend bool operator <  (const stack<T, Sequence>& x, const stack<T, Sequence>& y)
	{
    
    
		std::cout << "operator < " << '\t';
		return true;
	}
	//friend bool operator== <T> (const stack&, const stack&);
	//friend bool operator< <T> (const stack&, const stack&);
	//friend bool operator== < >(const stack&, const stack&);
	//friend bool operator< < >(const stack&, const stack&);
	public:
	stack(){
    
    std::cout << "stack" <<std::endl;}
	private:
	Sequence c;
};

/*
template <class T, class Sequence>
bool operator == (const stack<T, Sequence>& x, const stack<T, Sequence>& y)
{
	return std::cout <<"operator == " << '\t';
}

template <class T, class Sequence>
bool operator<(const stack<T, Sequence>& x, const stack<T, Sequence>& y)
{
	return std::cout<<"operator < " << '\t';
}
*/

int main()
{
    
    
	stack<int> x;
	stack<int> y;
	std::cout << (x==y) << std::endl;
	std::cout << (x<y) <<std::endl;
}

Para el código anterior, los resultados de mi prueba son los siguientes.
inserte la descripción de la imagen aquíSe puede ver que se pasa la prueba, pero si la implementación de estas funciones se coloca fuera del código que comenté, no pasará, esto es inconsistente con el contenido del libro de Hou Jie, y puede ser un problema con el compilador, etc. detalles de la siguiente manera:

friend bool operator== <T> (const stack&, const stack&);

Siempre cometo errores en tal declaración, y verifiqué la información más tarde.
inserte la descripción de la imagen aquí
Así que trate de usar la forma tradicional de declarar. Al mismo tiempo, intente implementar el código dentro de la plantilla, como la plantilla anterior.
Este es el resultado de mi propia prueba. Si hay algún error, discútanlo juntos.

Comprensión:
en la clase de plantilla, la función de amigo debe implementarse en el cuerpo de la clase tanto como sea posible;

Supongo que te gusta

Origin blog.csdn.net/weixin_43851636/article/details/122061623
Recomendado
Clasificación