1

我目前正在尝试编写树数据结构。在尝试为我的原始数据结构创建迭代器,然后了解 STL 规范之后,我走上了这条路。

我将尝试稍微压缩我的代码,但仍然会展示我对代码未编译的困惑。如果缺少某些内容,我会很乐意稍后添加。

// Relevant bits of tree.hpp
template <class T, class Alloc = std::allocator<T> >
class tree
{
public:
    struct NODE
    {
        T                  data;
        std::vector<NODE*> children;
        NODE*              parent;
        NODE*              right;

        // Not shown here: size()
    };

    typedef Alloc                           allocator_type;
    typedef typename Alloc::value_type      value_type;
    typedef value_type&                     reference;
    typedef const value_type&               const_reference;
    typedef typename Alloc::difference_type difference_type;
    typedef typename Alloc::size_type       size_type;

    class iterator
    {
    public:
        typedef typename Alloc::difference_type difference_type;
        typedef typename Alloc::value_type      value_type;
        typedef typename Alloc::reference       reference;
        typedef typename Alloc::pointer         pointer;
        typedef std::forward_iterator_tag       iterator_category;

        iterator(NODE* node) : currentNode_(node) {}
        iterator(const iterator& i) : currentNode_(i.currentNode_) {}

        iterator& operator++ ();

        // Not shown here: operator==, operator!=, operator*, operator->

    private:
        NODE* currentNode_;
    };

    // Not shown here: constructors, begin(), end(), size(), empty(), etc...

private:
    NODE root_;
};

// Relevant bits of tree.cpp
template <class T, class Alloc>
typename tree<T, Alloc>::iterator&
tree<T, Alloc>::iterator::operator++ ()
{
    if (!currentNode_->children.empty())
        currentNode_ = currentNode_->children.front();

    else if (currentNode_->right != nullptr)
        currentNode_ = currentNode_->right;

    else {
        while (currentNode_->parent->right == nullptr)
            currentNode_ = currentNode_->parent;
        currentNode_ = currentNode_->parent->right;
    }
    currentNode_ = "abc - Just some random string, definitely not a NODE*";
    return *this;
}

为什么我可以分配看似随机的东西currentNode_?此外,即使我返回的东西显然不是 a iterator&,或者甚至只是将 return 语句全部省略,代码仍然可以愉快地编译。到底是怎么回事?

我还没有测试当我实际调用代码时会发生什么,因为我还没有实现实际代码来填充树。在继续之前,我想确保我掌握了这些基础知识。

Ninja 编辑:要编译,我调用find src/ -name "*.cpp" | xargs g++ -Isrc/ -O3 -Wall -Wextra -pedantic -std=gnu++0x || exit 1.

4

1 回答 1

2

由于currentNode_取决于模板的类型,因此在您实际实例化/使用该函数之前,该部分编译不会完成。调用运算符后,您将在文字字符串分配上得到预期的编译错误。

于 2013-05-10T23:04:26.723 回答