目的:熟悉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&);
自己这样申明总是出错,后面查阅了资料。
所以尽量使用传统的那种方式申明。同时尽量在模板内部实现代码,如上面给予的通过的模板。
这是自己测试的结果,如果有错误欢迎大家一起讨论。
感悟:
在模板类中,友元函数尽量在类体进行实现;