私は現在、ツリーデータ構造を書き込もうとしています。元のデータ構造の反復子を作成しようとした後、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
。