类模板的好友声明
Friend declaration of class template
>我遇到了朋友类模板的问题。 这是我的代码的样子
template<typename T>
class A{
private:
template<typename U>
friend class A;
int m_num = 0;
public:
//...
};
而
template <typename T>
class B{
private:
template<typename U>
friend class B;
template<typename U>
friend class A; // Set A as friend class template of B
public:
template<typename U>
int GetNumOfA(const A<U>& a){
return a.m_num; // Cannot Access A's private member!
}
};
我希望 A 的私人成员可以访问,因为我将 A 声明为 B 的好友类。但它无法访问它。 你能帮我弄清楚为什么会这样吗?或者有什么想法可以让m_num从 B 访问?
你用错了方式。你想B
成为A
的朋友。所以你需要在A
的定义中声明B
朋友:
template<typename T>
class A{
//...
template<typename U>
friend class B;
//...
};
但是,请考虑您是否真的希望所有这些课程及其不同的专业都friend
。使成员private
的要点是,它表示类的内部状态,不应由不相关的代码直接访问。通常,如果您需要直接访问某个成员,则应将其设为public
,或者如果存在不允许这样做的类不变量,则通过保留不变量的public
成员函数提供对它的访问。
相关文章:
- .cpp和.h文件中的模板专用化声明
- 未在作用域中声明unordered_map
- C++避免重复声明的语法是什么
- 如何确保C++函数在定义之前声明(如override关键字)
- 类模板的好友声明
- MSVC 2017 - 错误 - 如何将模板类 X 的模板成员函数声明为嵌套类 X::Y 的好友
- 为什么转发声明的好友类不能在类中引用?
- 使用好友声明访问私有模板
- 声明嵌套基模板类实例是派生类的好友
- 无法在好友函数中实例化类?我没有得到在范围错误中声明
- 如何在 OSX 上将静态C++函数声明为好友
- 当我将一个类声明为其他类的成员时出现错误。 错误:声明好友时必须使用类键
- 放置好友声明
- 在好友声明中使用限定名称的规则是什么?
- 如何声明两个类,以便 A 具有 B 的成员,B 将 A 的成员标记为好友
- 转发声明和好友函数
- 受保护部分中的好友声明
- 在 B 类中声明为好友的 A 类成员模板函数无法访问 A 类的私有成员(仅限 Clang)
- 无法为 Typedef 声明好友
- 如何在模板类中声明好友用户定义的文字操作符