// 模版类与友元
// 外部实现的友元函数
// 是函数模板时，必须在类定义之前声明。在类中声明友元全局函数时，必须使用<> 空泛型表示此函数是函数模板。

#include <iostream>
#include <cstring>
#include <cstdlib>

using namespace std;

template <typename T>
class A;
template <typename T>
void showOut(A<T> &a);

template <typename T>
class A
{
    // 外部实现的友元函数，它有自己的模版类型，不需要指定当前模版类的类型
    // <>空泛型表示外部是函数模版，模版的泛型同当前类的泛型
    // 要求: 必须之前先声明此函数为构造函数
    friend void showOut<>(A<T> &a);

private:
    T item;

public:
    A(T item)
    {
        this->item = item;
    }
};

template <typename T>
void showOut(A<T> &a) // 全局友元函数
{
    cout << "out item is: " << a.item << endl;
}

int main()
{
    A<int> a(30);
    showOut(a);
    return 0;
}
