如何在普通类中定义一个和模板有关的友元?

下面代码为什么不能运行?
需求是一个模板类,然后有个类特化了这个模板类,然后新的类中的成员函数中有个函数的参数是另外一个类的实例,然后这个实例需要访问本类的私有成员。

代码如下:
#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>

template <class T>
class N
{
public:
    void fun(T&t);
};

template <class T>
void N<T>::fun(T& t)
{
    t.f();
}

class A;

class M: public N<A>
{
};

class A
{
private:
    //    public:
    void f();

    friend  N<A>;
};

void A::f()
{
    printf("hello world\n");
}

int main(int argc, char* argv[])
{
    A a;
    M m;
    m.fun(a);

    return 0;
}

温馨提示:内容为网友见解,仅供参考
无其他回答
相似回答