我目前正在尝试编写树数据结构。在尝试为我的原始数据结构创建迭代器,然后了解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&
,或者甚至只是将返回语句全部遗漏,代码仍然很乐意编译。发生了什么事?
我还没有测试当我实际调用代码时会发生什么,因为我还没有实现实际代码来填充树。我想确保在继续之前就掌握这些基础知识。
Ninja编辑:要编译,我致电find src/ -name "*.cpp" | xargs g++ -Isrc/ -O3 -Wall -Wextra -pedantic -std=gnu++0x || exit 1
。
答案 0 :(得分:2)
由于currentNode_
依赖于模板的类型,因此在实际实例化/使用该函数之前,不会进行编译的那部分。一旦调用了运算符,就会在文字字符串赋值上得到预期的编译错误。