STL源码剖析:bound friend template friend代码测试和理解

目的:熟悉STL的源码
最近看STL的源码剖析这本书,之前看过一遍,但是都是走马观花,没有自己亲自实验这些代码,所以对一些概念可能自己以为理解了,实际上根本没有了解。如下面自己的在书本上摘录的一段代码,我用的是ubuntu 18.04版本的g++编译器,可能每个编译器不一样,但是我只是深入了解一下,关于STL的库,以及用法。
其中的关于模板类中的友元函数,以及友元函数的函数重载的函数。下面直接给代码,以及测试的结果,后面将给予自己的感悟。

#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;
}

对于上述的代码,我测试的结果是如下。
在这里插入图片描述可以看到通过测试,但是如果在我注释的代码中,将这些函数的实现放在外面的情况下,它是不通过的,这个和侯杰书中的内容不一致,也有可能是自己编译器问题等等。具体如下:

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

自己这样申明总是出错,后面查阅了资料。
在这里插入图片描述
所以尽量使用传统的那种方式申明。同时尽量在模板内部实现代码,如上面给予的通过的模板。
这是自己测试的结果,如果有错误欢迎大家一起讨论。

感悟:
在模板类中,友元函数尽量在类体进行实现;

猜你喜欢

转载自blog.csdn.net/weixin_43851636/article/details/122061623