| |
| #include<iostream> |
| using namespace std; |
| |
| template <class T> |
| class Tmpl; |
| |
| template <class T> |
| void Func1(Tmpl<T> &x) |
| { |
| |
| cout << "this is a global function :Func1()" << endl<<"\t"; |
| x.print(); |
| |
| } |
| |
| template <class T> |
| class B |
| { |
| public: |
| void Func(Tmpl<T>& x); |
| }; |
| |
| template <class T> |
| class Tmpl |
| { |
| T a; |
| public: |
| friend void Func1(); |
| friend class A; |
| |
| template<class T> |
| friend void B<T>::Func(Tmpl<T>&); |
| Tmpl(T a_=0):a(a_) |
| { |
| cout << "the Tmpl<T>::constructor was called!" << endl; |
| } |
| void print() |
| { |
| cout << "a=" << a << endl; |
| } |
| }; |
| |
| class A |
| { |
| Tmpl<double> obj_in_A; |
| public: |
| void printA() |
| { |
| cout << "this is a function of class A" << endl; |
| |
| } |
| A(double a_):obj_in_A(a_) |
| { |
| |
| cout << "从友元类A(普通类A)中访问Tmpl<T>的私有成员a:" <<endl; |
| cout << "a=" << obj_in_A.a << endl; |
| } |
| }; |
| |
| template<class T> |
| void B<T>:: Func(Tmpl<T>& x) |
| { |
| cout << "this is a function of class B:" << endl; |
| cout << "从友元函数(类模板B<T>的函数Func(Tmpl<T>& x))中访问Tmpl<T>的私有成员a:" << endl; |
| cout << "x.a=" << x.a<< endl; |
| } |
| |
| int main() |
| { |
| Tmpl<int> i(7); |
| i.print(); |
| Func1(i); |
| |
| Tmpl<double> f(7.889); |
| f.print(); |
| |
| A obj1(3.14); |
| B<double> obj2; |
| obj2.Func(f); |
| |
| } |
| |

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了