如何分配这个明显错误的类型不会给编译器错误?

时间:2013-05-10 22:55:10

标签: c++ templates types compilation

我目前正在尝试编写树数据结构。在尝试为我的原始数据结构创建迭代器,然后了解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

1 个答案:

答案 0 :(得分:2)

由于currentNode_依赖于模板的类型,因此在实际实例化/使用该函数之前,不会进行编译的那部分。一旦调用了运算符,就会在文字字符串赋值上得到预期的编译错误。