【问题标题】:C++ Iterator: no appropriate default constructor availableC++ 迭代器:没有合适的默认构造函数可用
【发布时间】:2014-07-02 00:21:29
【问题描述】:

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

'LinkedListIterator>' : 没有合适的默认构造函数可用 'LinkedListIterator> LinkedList::begin(void)' : 无法将'this' 指针 rom 'const LinkedList' 转换为 'LinkedList &' 'LinkedListIterator> LinkedList::end(void)' : 无法将 'this' 指针从 'const LinkedList' 转换为 '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;
    }
};
}

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

【问题讨论】:

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


    【解决方案1】:

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

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

    但是你称它们为 const object 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&lt;Node&lt;T&gt;&gt; 类没有默认构造函数,但在代码中的某些地方,您使用默认构造函数创建了这种类型的对象。

    【讨论】:

    • 这是问题所在,其他错误在我定义 const_iterator 后就消失了。谢谢!
    【解决方案2】:

    假设“迭代器”被定义为“LinkedListIterator”,您似乎正试图将“头”和“尾”变量(似乎是全局的?)传递给不存在且编译器正在生成的构造函数最后放弃了与复制构造函数匹配的努力(没有匹配)。

    我认为代码应该如下:

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

    【讨论】:

    • 对不起,我没有正确编写代码,它们是 LinkedList 类的一部分(更新线程)
    • 出于好奇,您使用的“std::unique_ptr”是否有内置的“operator node*”操作来转换为“node*”?
    • 它有一个 .get() 函数,它返回指向节点的指针
    猜你喜欢
    • 2016-04-22
    • 2013-10-14
    • 1970-01-01
    • 2017-08-15
    • 1970-01-01
    • 2014-05-26
    • 2023-03-26
    • 1970-01-01
    • 2011-12-22
    相关资源
    最近更新 更多