转换为模板后,类成员受限制

时间:2014-04-21 06:09:10

标签: c++

所以我正在使用模板,我遇到了一个问题。将代码转换为模板后,我无法再访问类的私有成员。我得到'current'是'Iterator'的私有成员的错误。所以首先我要上课:

template <class T>
struct nodeType {
    T info;
    nodeType<T> *link;
};

template <class T>
class Iterator {
public:
    Iterator();
    Iterator(nodeType<T> *);
    T operator*();
    bool IsNull();
    Iterator<T> operator++();
    Iterator<T> operator++(int);
    bool operator==(const Iterator<T> &) const;
    bool operator!=(const Iterator<T> &) const;
    Iterator<T> &operator=(T);
private:
    nodeType<T> *current;
};

template <class T>
class LinkedList {
public:
    LinkedList();
    LinkedList(const LinkedList<T> &);
    ~LinkedList();
    void InsertHead(T);
    Iterator<T> InsertAfter(T, Iterator<T>);
    Iterator<T> Search(T);
    bool IsEmpty();
    void Print();
    void DestroyList();
    Iterator<T> Start();
    Iterator<T> End();
    const LinkedList<T> &operator=(const LinkedList<T> &);
private:
    nodeType<T> *head;
};

在我使用模板之前,我使用了以下代码,但current不是私有的,这不再有效。

template <class T>
Iterator<T> LinkedList<T>::InsertAfter(T input, Iterator<T> marker) {
    Iterator<T> newNode = new nodeType<T>;
    Iterator<T> findNode = marker;

    newNode = input;
    newNode.current->link = findNode.current->link;
    findNode.current->link = newNode.current;
    return findNode;
}

然后我尝试执行以下操作并且没有错误但是当我调用InsertAfter函数将新项添加到列表时它没有显示。我做了cout newNode =输入;它显示了我想要插入的值,但节点似乎没有连接起来。为什么我不能使用以前的代码?与newNode.current->link = findNode.current->link;

一样
template <class T>
Iterator<T> Iterator<T>::operator++() {
    current = current->link;
    return *this;
}

template <class T>
Iterator<T> Iterator<T>::operator++(int) {
    Iterator<T> temp;

    temp = *this;
    ++(*this);
    return temp;
}

template <class T>
Iterator<T> LinkedList<T>::InsertAfter(T input, Iterator<T> marker) {
    Iterator<T> newNode = new nodeType<T>;
    Iterator<T> findNode = marker;

    newNode = input;
    newNode++ = findNode++;
    findNode++ = newNode;
    return findNode;
}

1 个答案:

答案 0 :(得分:0)

您无法在newNode.current的成员函数中执行LinkedList,因为current属于Iterator。这就是private的意思 - 它只能从它所属的类的成员函数中访问。

显然,您的“旧”代码不同。可能你在旧代码中有Iterator friend LinkedList。如果你发布旧代码,它可能会清除。