template <int*>
class X {};
template <typename T>
void g();
struct S;
template <typename T>
struct R;
class B {
protected:
int i; static int j;
};
class D : public B {
friend void f();
template <typename T>
friend void g();
friend struct S;
template <typename T>
friend struct R;
};
struct S {
void h();
X<&B::j> x;
};
template <typename T>
struct R {
void h();
X<&B::j> x;
};
B b;
D d;
void f()
{
b.i = 3; d.i = 4;
B::j = 5;
D::j = 6;
}
template <typename T>
void g()
{
b.i = 3; d.i = 4;
B::j = 5;
D::j = 6;
}
template void g<int>();
void S::h()
{
b.i = 3; d.i = 4;
B::j = 5;
D::j = 6;
}
template <typename T>
void R<T>::h()
{
b.i = 3; d.i = 4;
B::j = 5;
D::j = 6;
}
template struct R<double>;