为什么声明的友元函数还是提示不能访问private成员
[code]
template<class T> class A;  //B类模板
template<class T>
class B{
friend A<T>;
private:
T data;
};//C类
class C{};//A类模板
template<class T>
class A
{
public:
void Fun()
{
C c;
B<C> x;  
x.data = c;  //编译错误error C2248: “B<T>::data”: 无法访问 private 成员(在“B<T>”类中声明)
B<int> y;
y.data = 1; //这个正常
}
};int main()
{

A<int> a;
//A a;   //如果A改成普通类就不报错
a.Fun();
return 0;
}
[/code]

解决方案 »

  1.   

    代码不知道为什么没贴上来:
    template<class T> class A;  //B类模板
    template<class T>
    class B{
    friend A<T>;
    private:
    T data;
    };//C类
    class C{};//A类模板
    template<class T>
    class A
    {
    public:
    void Fun()
    {
    C c;
    B<C> x;  
    x.data = c;  //编译错误error C2248: “B<T>::data”: 无法访问 private 成员(在“B<T>”类中声明)
    B<int> y;
    y.data = 1; //这个正常
    }
    };int main()
    {

    A<int> a;
    //A a;   //如果A改成普通类就不报错
    a.Fun();
    return 0;
    }
      

  2.   

    再试试代码高亮template<class T> class A;  //B类模板
    template<class T>
    class B{
    friend A<T>;
    private:
    T data;
    };//C类
    class C{};//A类模板
    template<class T>
    class A
    {
    public:
    void Fun()
    {
    C c;
    B<C> x;  
    x.data = c;  //编译错误error C2248: “B<T>::data”: 无法访问 private 成员(在“B<T>”类中声明)
    B<int> y;
    y.data = 1; //这个正常
    }
    };int main()
    {

    A<int> a;
    //A a;   //如果A改成普通类就不报错
    a.Fun();
    return 0;
    }
     
      

  3.   

    template <class T>
    class A;//B类模板
    template <class T>
    class B
    {
    template<class U>
    friend class A;//你之前写的是针对某个类型的友元
    private:
    T data;
    };//C类
    class C {};//A类模板
    template <class T>
    class A
    {
    public:
    void Fun() {
    C c;
    B <C> x;
    x.data = c;  //编译错误error C2248: “B <T>::data”: 无法访问 private 成员(在“B <T>”类中声明)
    B <int> y;
    y.data = 1; //这个正常
    }
    };int main()
    {
    A <int> a;
    //A a;  //如果A改成普通类就不报错
    a.Fun();
    return 0;
    }