下面代码为什么不能运行?
需求是一个模板类,然后有个类特化了这个模板类,然后新的类中的成员函数中有个函数的参数是另外一个类的实例,然后这个实例需要访问本类的私有成员。
代码如下:
#include <stdio.h>
class A
{
private:
// public:
void f();
friend class M;
};
void A::f()
{
printf("hello world\n");
}
template <class T>
class N
{
public:
void fun(T&t);
};
template <class T>
void N<T>::fun(T& t)
{
t.f();
}
class M: public N<A>
{
};
int main(int argc, char* argv[])
{
A a;
M m;
m.fun(a);
return 0;
}
编译错误:
MG.cpp: In member function ‘void N<T>::fun(T&) [with T = A]’:
MG.cpp:40: instantiated from here
MG.cpp:14: error: ‘void A::f()’ is private
MG.cpp:29: error: within this context
这是因为 fun 函数是属于N<A>类的,而M和N<A>是两个不同的类,M只是N<A>的子类。
要想 fun 函数能够访问 A 的成员。必须将N<A>类作为 A 的友元。
所以你应该这样:
class A
{
private:
// public:
void f();
friend N<A>;
};
而不是这样:
class A
{
private:
// public:
void f();
friend M;
};
但考虑到前置声明的问题,所以完整的写法是这样:
#include <stdio.h>