【问题标题】:Nested class pointer access嵌套类指针访问
【发布时间】:2013-06-10 00:27:51
【问题描述】:

我对 c++ 比较陌生,在尝试创建链接列表时遇到了一个我不理解的错误。

代码:

    template <typename T>
class List{
    class Node{
            T data;
        Node<T> *next;
        Node<T> *previous;

        Node<T>(T& data,const Node<T> *next,const Node<T> *previous): data(data),
                    next(next),previous(previous){
            };
            };
    Node<T> *head;
    Node<T> *tail;
    int size;
public:
    class Iterator{
            Node<T> *node;
            List<T> *list;
             };
    void List<T>::remove(List<T>::Iterator& It){
        if(It.list!=this){ // FIELD list COULD NOT BE RESOLVED
            throw NON_MATCHING_LIST();
        }
        if(size==0 || It.node=tail){ //FIELD node COULD NOT BE RESOLVED
            throw ELEMENT_NOT_FOUND();
        }
        It.node->previous=It.node->next; //FIELD node COULD NOT BE RESOLVED (and naturally the rest).
        It.node->next->previous=It.node->previous
    }

};

在我的删除函数中,我试图删除迭代器之前的列表成员,唉,我收到一个错误提示

节点/列表字段无法解析

我尝试将迭代器作为 Iterator& 或 Iterator 类型传递,但都没有成功。

如果有任何反馈,我们将不胜感激。

【问题讨论】:

  • 不确定这是否是唯一的问题,但您需要一些typenames,例如:typename List&lt;T&gt;::Iterator
  • Node 不是类模板。只说Node,而不是Node&lt;T&gt;List 是一个模板,所以说List&lt;T&gt;::Node
  • 这实际上解决了它,谢谢。安迪,如果您重新发布作为答案,我会接受。
  • 另外,不要用类中的类名来限定成员函数声明(例如void remove(...),而不是void List&lt;T&gt;::remove(...)
  • 另外,It.node=tail 应该是 It.node==tail ;)

标签: c++ class pointers c++11


【解决方案1】:

除了其他人在 cmets 中提到的问题之外,您的(第一个)问题似乎是您需要使用 typename 消歧器:

    typename List<T>::Iterator
//  ^^^^^^^^

这告诉编译器它应该将 Iterator 解析为 type 的名称,而不是 List&lt;T&gt; 的数据成员的名称。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-15
    • 1970-01-01
    • 2021-05-21
    • 1970-01-01
    相关资源
    最近更新 更多