C ++迭代器:没有合适的默认构造函数可用

时间:2014-07-02 00:21:30

标签: c++ c++11 linked-list iterator

我正在尝试使用自定义迭代器实现链接列表。 我在尝试实现复制构造函数时遇到了一堆错误:

'&LinkedListIterator GT;' :没有适当的默认构造函数可用 '&LinkedListIterator GT;链表::开始(无效)' :不能转换这个'指针rom' const LinkedList'到“链接列表”' '&LinkedListIterator GT;链表::端(无效)' :不能转换这个'指针来自' const LinkedList'到“链接列表”'

链表

class LinkedList
{
std::unique_ptr<node> head;
std::unique_ptr<node> tail;

LinkedList(const LinkedList& other)
{
    init();
    iterator i = other.begin();
    while (i != other.end())
        add(*i++);

    head = other.head;
    tail = other.tail;
}

iterator begin() 
{
    return iterator(head->next);
}

iterator end()
{
    return iterator(tail);
}

迭代

template <typename TNode>
class LinkedListIterator
{
    friend class LinkedList<typename TNode::value_type>;
    TNode* p;
public:
    LinkedListIterator(TNode* p) : p(p) {}
    LinkedListIterator(const LinkedListIterator& other) : p(other.p) {}
    LinkedListIterator& operator=(LinkedListIterator other) { std::swap(p, other.p); return *this; }
    void operator++() { p = p->next; }
    void operator++(int) { p = p->next; }
    bool operator==(const LinkedListIterator& other) { return p == other.p; }
    bool operator!=(const LinkedListIterator& other) { return p != other.p; }
    int& operator*() { return p->data; }
    LinkedListIterator<TNode> operator+(int i)
    {
        LinkedListIterator<TNode> iter = *this;
        while (i-- > 0 && iter.p)
        {
            ++iter;
        }
        return iter;
    }
};
}

如果您需要我发布更多代码,请告诉我。谢谢。

2 个答案:

答案 0 :(得分:3)

成员函数begin()end()被定义为非常量成员函数

iterator begin() 
{
    return iterator(head->next);
}

iterator end()
{
    return iterator(tail);
}

但是你为const对象other

调用它们
LinkedList(const LinkedList& other)
{
    init();
    iterator i = other.begin(); // <== here
    while (i != other.end()) // <== here
        add(*i++);

    head = other.head;
    tail = other.tail;
}

至于错误消息

  

没有合适的默认构造函数

然后我看不到默认构造函数的使用位置。然而,错误消息足够清楚:类LinkedListIterator<Node<T>>没有默认构造函数,但在代码中使用默认构造函数创建此类型的对象。

答案 1 :(得分:0)

假设'iterator'被定义为'LinkedListIterator',你似乎试图将'head'和'tail'变量(看似全局?)传递给不存在且编译器正在构造的构造函数最后一次努力与复制构造函数匹配(没有匹配)。

我认为代码应该如下:

iterator begin() 
{
    return iterator(head->next.get());
}

iterator end()
{
    return iterator(tail.get());
}