Skip to content

1334: 是不是友元

题目

题目描述

你学会了类模板,你学会了友元,你就学会了类模板的友元

先来复习以下类模板的友元。

  • 类模板可以声明两种友元:普通友元模板的特定实例的友元
  • 当声明另一个模板为友元时,可以分为以下两种情况。
  • 约束模板友元,即友元的类型取决于类被实例化时的类型。
  • 非约束模板友元,即友元的所有实例化都是类的每一个实例化的友元。

C++的类模板友元的两种形式:

template <class T1,class T2> class A;
template <class T1,class T2,class T3> class B;</p>
<p>template <class T1,class T2>
class A{
    template<class U1,class U2,class U3> friend class B; //非约束友元
    friend B<T1,T2,T2>;//约束友元
private:
};
本题中仍需要支持一些C++中没有的情形,例如半约束、带模板参数实例化的友元等情况(见输入格式中的说明)

学习了类模板的友元后,罗布同学还是很困惑,所以请你编写程序来判断两个实例化后的类模板是否为友元。

输入格式

第一行是两个整数n和m。

接下来是n个类模板的声明,为了简化字符串处理的难度,此处的类模板声明与C++的声明在形式上不同。

类模板的声明如下:

第一行是模板参数与类模板名,模板参数用< temp1 temp2 ... > 表示,参数、角括号、类名间用空格隔开。

接下来一行是整数k,代表该类模板有k个友元声明,每个友元声明占一行。

友元声明行由三部分组成,格式为< ... > className < ... >,分别是模板参数、类名、实例化参数表,模板参数可以为空,但尖括号仍需保留。

例如:

< T1 T2 T3 > A //声明了有三个模板参数T1,T2,T3的类A < > B < T1 T2 > //声明了B < T1 T2 >实例化的类是A的约束友元 < U1 U2 > c < U1 U2 > //声明了C为A的非约束友元 < U > D < T1 U > //半约束的友元,这与C++不同 < U > E < U U > //带模板参数实例化的友元,声明了只有实例化E的参数相同时E才是A的友元,这与C++不同

类模板声明结束后是m个询问,每个询问占两行,先后分别是实例化的类模板A和实例化的类模板B,如果A是B的友元,则输出Yes并换行;否则输出No并换行。

类模板的实例化: 第一个字符串代表被实例化的类模板名称,接下来是实例化参数表< ... >,含有与该类模板的形式参数数量相同的字符串,用空格隔开,代表实例化时的参数。

所有的类模板都已被声明,即类模板的出现顺序不会产生影响

输出格式

m个YesNo

每个占一行

样例输入

sample1

``` 2 3 < T1 T2 T3 > A 1 < > B < T1 T2 >

< T1 T2 > B 1 < U3 > A < T1 T2 U3 >

A < int double string > B < int double >

A < int double string > B < int char >

B < int string > A < int double string > ```

样例输出

sample1

Yes No No

数据范围

1<= n <= 100

1<= m <= 100

Oops! 本题目还没有解答!

助教老师们编题的速度,已经超过了解题的速度!

OJ翻了一新,但本解答集还大多用的是2017-2019级,甚至更早的同学们贡献的答案。

如果你已经AC了,可以的话,请您参考添加页面,与大家一起分享你的题解!