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_なぜですか? さらに、明らかに ではないものを返しiterator&たり、return ステートメントをすべて省略したりしても、コードは問題なくコンパイルされます。何が起こっている?

ツリーを作成する実際のコードをまだ実装していないため、実際にコードを呼び出したときに何が起こるかはまだテストしていません。それを続ける前に、これらの基本を正しく理解していることを確認したかった.

Ninja edit : コンパイルするには、 を呼び出します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 に答える