C++ 为什么可以';我的好友类不能访问私人成员吗?

C++ 为什么可以';我的好友类不能访问私人成员吗?,c++,pointers,linked-list,enumeration,friend,C++,Pointers,Linked List,Enumeration,Friend,我想当一个类声明一个friend类时,friends可以访问庄家的私有成员?情况似乎不是这样,或者我做错了什么。我正在尝试访问OULinkedList中的“第一个”或“最后一个”。当我尝试使用“first”或“last”时,会出现“not declared in this scope”错误 我需要访问“first”,因为如果没有它,我的下一个函数将永远不会返回链表的第一个值,而且我不知道其他方法如何执行 例如,如果我只想打印列表中的对象,下面的while循环总是跳过第一个对象 while(enu

我想当一个类声明一个friend类时,friends可以访问庄家的私有成员?情况似乎不是这样,或者我做错了什么。我正在尝试访问OULinkedList中的“第一个”或“最后一个”。当我尝试使用“first”或“last”时,会出现“not declared in this scope”错误

我需要访问“first”,因为如果没有它,我的下一个函数将永远不会返回链表的第一个值,而且我不知道其他方法如何执行

例如,如果我只想打印列表中的对象,下面的while循环总是跳过第一个对象

while(enumerator.hasNext()){
    cout << enumerator.next();
}
while(枚举数.hasNext()){
电流=第一;
}
模板
布尔OulinkedListNumerator::hasNext()常量{
如果(此->当前->下一步!=NULL){
返回true;
}否则{
返回false;
}
}
模板
T oulinkedListNumerator::next(){
T successorNode=*此->当前->下一步->数据;
本->当前=本->当前->下一步;
返回成功节点;
}
模板
T oulinkedListNumerator::peek()常量{
如果(当前!=NULL){
返回*当前->数据;
}否则{
抛出新的ExceptionLinkedListAccess;
}
}
  • 您发布的描述表明您的代码编译成功。在这种情况下,您在问题的标题中谈论了哪些私有访问问题?C++中的访问控制是纯粹的编译时概念。如果您的代码编译成功,那么它在私有访问方面没有问题

  • 您的类模板
    OULinkedListEnumerator
    OULinkedList
    类模板中的嵌套类模板。与任何嵌套类一样,它应该能够完全访问封闭类模板的私有成员
    OULinkedList
    ,而不需要任何友元声明

  • 以防万一,当您为未知实体进行友元声明时,该实体被假定为封闭命名空间范围的成员。那么你的

    template <typename F>
    friend class OULinkedListEnumerator;
    
    模板
    友元类oulinkedlistenmerator;
    
    引用全局类模板
    ::oulinkedListNumerator
    ,并使其成为朋友。稍后,您将声明一个嵌套类模板
    OULinkedList::OULinkedListEnumerator
    。这是一个完全不同的类模板。它不是一个朋友。(但不必如此,见2)

  • 不允许在嵌套模板声明中重用模板参数名称。必须将嵌套模板参数的名称从
    T
    更改为其他名称。事实上,我很惊讶您能够在没有首先解决参数命名问题的情况下将代码编译到所谓的“访问问题”的程度


  • 相关的,甚至重复:,但是+1会吸引很多人,我看不到
    while(enumerator.hasNext()){
    在您发布的代码中的任何位置。可能重复的请不要在收到回答后破坏问题。这在堆栈溢出上是不允许的。我犯了一个错误,没有澄清我在尝试访问“first”或“last”时收到的投诉—“未在此范围内声明”,并且我没有使用“first”或“last”“最后"代码中的任何地方。我将友元类声明更改为“F”而不是“T”。这可能是问题的一部分吗?如果我在声明中将其声明为“F”,那么在OulinkedListNumerator中定义也必须是F吗?@Adam G:我看到您在友元声明中将
    T
    更改为
    F
    ,但您仍然是u在
    oulinkedListNumerator
    的实际声明中使用
    T
    。这怎么可能?您的
    oulinkedListNumerator
    实际上是一个嵌套类模板吗?还是您只是忘记了关闭
    }
    在您发布的代码中定义了
    OULinkedList
    之后?请发布真实代码,而不是一些虚构的草图。
    template <typename F>
    friend class OULinkedListEnumerator;