C++ 为什么会出现错误';无法访问类';即使我已经宣布了朋友班

C++ 为什么会出现错误';无法访问类';即使我已经宣布了朋友班,c++,friend,C++,Friend,考虑以下代码: #include <iostream> template<typename T> class A { private: T value; public: A(T v){ value = v;} friend class A<int>; }; template<typename T> class B { public: T method(A

考虑以下代码:

#include <iostream>

template<typename T>
class A
{
    private:
        T value;

    public:
        A(T v){ value = v;}

        friend class A<int>;
};

template<typename T>
class B
{
    public:
        T method(A<T> a){ return a.value; }  // problem here, but why?
};

int main()
{
    A<int> a(2);
    B<int> b;

    std::cout << b.method(a) << std::endl;
}
#包括
模板
甲级
{
私人:
T值;
公众:
A(tv){value=v;}
A级朋友;
};
模板
B类
{
公众:
T方法(A){returna.value;}//这里有问题,但为什么?
};
int main()
{
A(2);
B B;
std::cout
#包括
模板
甲级
{
私人:
T值;
公众:
A(tv){value=v;}
T getValue(){返回值;}
};
模板
B类
{
公众:
A级朋友;
T方法(A){返回A.getValue();}
};
int main()
{
A(2);
B B;
std::cout
#包括
模板
甲级
{
私人:
T值;
公众:
A(tv){value=v;}
T getValue(){返回值;}
};
模板
B类
{
公众:
A级朋友;
T方法(A){返回A.getValue();}
};
int main()
{
A(2);
B B;
std::cout
T方法(A){返回A.value;}
问题在这里,但为什么

因为
class
B
正在访问
class
A
private
成员
value

T方法(A){返回A.value;}
template<typename T>
class B;

template<typename T>
class A
{
    private:
        T value;
    public:
        A(T v){ value = v;}
        friend class B<int>;
};

template<typename T>
class B
{
    public:
        T method(A<T> a){ return a.value; }
};
问题在这里,但为什么

因为
class
B
正在访问
class
A
private
成员
模板
template<typename T>
class B;

template<typename T>
class A
{
    private:
        T value;
    public:
        A(T v){ value = v;}
        friend class B<int>;
};

template<typename T>
class B
{
    public:
        T method(A<T> a){ return a.value; }
};
乙级;; 模板 甲级 { 私人: T值; 公众: A(tv){value=v;} B级朋友; }; 模板 B类 { 公众: T方法(A){返回A.value;} };
如果你想让B使用A的私有属性,A类应该将B类作为朋友。

模板
乙级;;
模板
甲级
{
私人:
T值;
公众:
A(tv){value=v;}
B级朋友;
};
模板
B类
{
公众:
T方法(A){返回A.value;}
};


如果你想让B使用A的私有属性,A类应该有B类作为朋友。

这不应该在B类中吗?你需要允许B访问A的私有数据。
朋友A类;
为什么你只限于
而不是
?@DavidC.Rankin我可以这样做,但我认为这不是实际问题。原因是因为在我的实际代码中,这是一个数学库的一部分,我计划在int,float,double,complex上交朋友。这只是一个简单的例子,说明了这个问题。这不应该是在B类中吗?你需要允许B访问a的私人数据。
朋友类a;
为什么你只限于
,而不是
?@Da我可以这样做,但我不认为这是实际问题。原因是在我的实际代码中,这是一个数学库的一部分,我计划有int、float、double、complex的朋友。这只是一个简单的例子来说明这个问题。如果我要使用getter,那么为什么我需要声明一个friend类a不是吗?@James,我不认为你理解friend的用途。friend不会覆盖访问级别…@Omd CompSCI我的理解是friend允许你从类外访问私有成员,只要你是包含私有成员的类的朋友。使用你的解决方案,我可以删除“friend类”因为你只是在使用一个标准的getter,所以我想我的问题是,“friend类”的意义是什么您的解决方案中的行…如果我要使用getter,那么为什么我需要声明一个friend类?@James,我认为您不了解friend的用途。friend不会覆盖访问级别…@Omd CompSCI我的理解是,friend允许您从类外访问私人成员,只要您是该类的朋友包含私有成员的类。使用您的解决方案,我可以删除“friend类”行,但它仍然有效,因为您使用的是标准getter。因此,我想我再次向您提出的问题是,“friend类”的意义是什么您的解决方案中的行…您能提供一个解决方案吗?我尝试将好友类a移到B中,但这并不能解决问题。我还尝试在a和B中将a声明为好友,但这也不起作用。也许我缺少一些明显的内容,显式解决方案可以帮助我。不要将
值设置为
私有
因为你显然想从其他
类访问它。我不想公开它,因为我不想从所有类访问它,只想从一小部分相关类访问它。这就是为什么我要使用“friend”。我当然可以使用Omid Compsci建议的getter。你能提供一个解决方案吗?我尝试将friend类a移到B中,但这并不能解决问题。我还尝试将a声明为a和B中的friend,但这也不起作用。也许我遗漏了一些明显的问题,一个明确的解决方案可以帮助我。不要担心ake
value
private
因为你显然想从其他
类访问它。我不想公开它,因为我不想从所有类访问它,只想从一小部分相关类访问它。这就是为什么我要使用“friend”。我当然可以使用Omid Compsci建议的getter,这是正确的,
templateclass B的前向声明;
在定义
templateclass a{…}之前
。注意,
朋友B类;
A类的定义中的位置并不重要,
朋友B类;
是所有需要的,而不是
。谢谢!我本以为B类需要将A类作为朋友才能访问A类的私人数据。相反,它是相反,A班需要B班作为朋友
T method(A<T> a){ return a.value; }
template<typename T>
class B;

template<typename T>
class A
{
    private:
        T value;
    public:
        A(T v){ value = v;}
        friend class B<int>;
};

template<typename T>
class B
{
    public:
        T method(A<T> a){ return a.value; }
};