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&);

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值