1 //声明
 2 template<class T, class Sequence = deque<T>>
 3 class queue;
 4 //声明
 5 template <class T,class Sequence>
 6 bool operator==(const queue<T, Sequence>&x, const queue<T, Sequence>&y);
 7 //声明
 8 template <class T, class Sequence>
 9 bool operator<(const queue<T, Sequence>&x, const queue<T, Sequence>&y);
10 //class queue
11 template <class T,class Sequence = deque<T>>
12 class queue
13 {
14 //<>为空模板参数列表
15     friend bool operator==<>(const queue&x, const queue&y);
16     friend bool operator< < >(const queue&x, const queue&y);
17 
18 public:
19     ...
20 }
21 //友元函数类外实现
22 template<class T,class Sequence>
23 bool operator==(const queue<T, Sequence>& x, const queue<T, Sequence>& y)
24 {
25     return x.c == y.c;
26 }
27 template<class T,class Sequence>
28 bool operator<(const queue<T, Sequence>&x, const queue<T, Sequence>&y)
29 {
30     return x.c < y.c;
31 }

STL中的queue容器内部有一个deque,通过内含有deque,修改deque的接口,来实现一个queue,同理,stack也是类似。通过阅读源代码发现有友元函数函数类外实现,语法比较复杂,要提前告诉编译器很多东西。

再举一个简单的例子来说明友元函数类外实现

template<class Name,class Age>
class Person;

template<class Name,class Age>
void showPerson(const Person<Name,Age>p);

template<class Name, class Age = int>
class Person
{
    friend void showPerson<>(const Person<Name>p); 
public:
    Person(Name name, Age  age) :m_name(name), m_age(age) {}
    
private:
    Name m_name;
    Age  m_age;
};

template<class Name>
void showPerson(const Person<Name>p)
{
    cout << "name=" << p.m_name <<" "<< "age=" << p.m_age << endl;
}