C++ 发出重载箭头(->;)运算符c++;

C++ 发出重载箭头(->;)运算符c++;,c++,templates,operators,iteration,overloading,C++,Templates,Operators,Iteration,Overloading,我有一个存储数据的自定义容器和一个访问它的迭代器。问题是迭代器中的->运算符不允许我修改容器中的数据 值类型是一个std::pair 资料持有人: template <class tree> struct avl_node { private: typedef typename tree::key_type Key; typedef typename tree::mapped_type Type; typedef typename t

我有一个存储数据的自定义容器和一个访问它的迭代器。问题是迭代器中的->运算符不允许我修改容器中的数据

值类型是一个std::pair

资料持有人:

template <class tree>
struct avl_node {
private:
    typedef typename tree::key_type         Key;
    typedef typename tree::mapped_type      Type;
    typedef typename tree::value_type       value_type;
public:
    typedef avl_node*                       node_ptr;
    typedef const avl_node*                 const_node_ptr;
    node_ptr _parentNode, _leftNode, _rightNode;
    int _balance;
    Key first;
    Type second;
}
模板
结构avl_节点{
私人:
typedef typename树::key_type key;
typedef typename树::映射的_类型类型;
typedef typename树::值\类型值\类型;
公众:
typedef avl_node*node_ptr;
typedef const avl_node*const_node_ptr;
节点\u ptr\u parentNode、\u leftNode、\u rightNode;
国际收支平衡;
关键优先;
第二类;
}
迭代器:

template <class tree>
class avl_iterator {
public:
    typedef typename tree::node             node;
    typedef typename tree::node_ptr         node_ptr;
    typedef typename tree::const_node_ptr   const_node_ptr;
    typedef typename tree::utilities        utilities;
    typedef typename tree::value_type       value_type;
private:
    node_ptr _node;
public:
    avl_iterator() : _node()  { }
    avl_iterator( const node_ptr node ) : _node ( node ) { }
    ~avl_iterator() { _node = NULL; }

    avl_iterator& operator=(const avl_iterator& rhs) {
        _node = rhs._node;
        return (*this);
    }
    bool operator == ( const avl_iterator& rhs ) { return ( _node == rhs._node); }
    bool operator != ( const avl_iterator& rhs ) { return ( _node != rhs._node); }

    avl_iterator& operator++()
    {
        _node = utilities::next_node( _node );
        return (*this);
    }
    avl_iterator& operator ++( int ) {
        avl_iterator temp(*this);
        ++(*this);
        return(temp);
    }

    avl_iterator& operator -- () {
        _node = utilities::prev_node( _node );
        return (*this);
    }

    avl_iterator& operator -- ( int ) {
        avl_iterator temp(*this);
        --(*this);
        return(temp);
    }

    value_type& operator * () {
        return value_type( node->first, node->second );
    }

    node_ptr operator -> () const {
        return _node;
    }
};
模板
类avl_迭代器{
公众:
typedef typename树::节点节点;
typedef typename树::node_ptr node_ptr;
typedef typename树::const_node_ptr const_node_ptr;
typedef typename树::实用程序;
typedef typename树::值\类型值\类型;
私人:
node_ptr_node;
公众:
avl_迭代器():_节点(){}
avl_迭代器(const node_ptr node):_node(node){}
~avl_迭代器(){u node=NULL;}
avl_迭代器和运算符=(常量avl_迭代器和rhs){
_节点=右侧。_节点;
返回(*本条);
}
布尔运算符==(const avl_迭代器&rhs){return(_node==rhs._node);}
布尔运算符!=(const avl_iterator&rhs){return(_node!=rhs._node);}
avl_迭代器和运算符++()
{
_node=实用程序::下一个\u节点(\u节点);
返回(*本条);
}
avl_迭代器和运算符++(int){
avl_迭代器温度(*此);
++(*本条);
返回(临时);
}
avl_迭代器和运算符--(){
_节点=实用工具::上一个节点(_节点);
返回(*本条);
}
avl_迭代器和运算符--(int){
avl_迭代器温度(*此);
--(*本条);
返回(临时);
}
值类型和运算符*(){
返回值类型(节点->第一,节点->第二);
}
节点_ptr运算符->()常量{
返回_节点;
}
};
主要

试试看{
使用名称空间avl;
avltree树;
插入(intPair(1,1));
插入(intPair(2,1));
插入(intPair(3,1));
插入(intPair(4,1));
插入(intPair(5,1));
插入(intPair(6,1));
插入(intPair(7,1));
插入(intPair(8,1));
插入(intPair(9,1));
插入(intPair(10,1));
插入(intPair(11,1));
插入(intPair(12,1));
avltree::迭代器;
//std::map::it迭代器;
for(it=tree.begin();it!=tree.end();+it)
{

std::coutfirst最好是

value_type value;
avl_节点中
而不是:

Key first;
Type second;
然后,您可以在
avl\u迭代器中定义:

value_type& operator * () const {
    return _node->value;
}

value_type* operator -> () const {
    return &_node->value;
}

最好有

value_type value;
avl_节点中
而不是:

Key first;
Type second;
然后,您可以在
avl\u迭代器中定义:

value_type& operator * () const {
    return _node->value;
}

value_type* operator -> () const {
    return &_node->value;
}

你能显示客户端代码吗?@AndyProwl,如果你是指我用来测试的代码,它被添加到帖子的底部是的,这就是我的意思。那么你的问题是:它允许或不允许修改?你的问题文本与你评论的代码冲突。你能显示客户端代码吗?@AndyProwl,如果你是指我用来测试的代码是的,这就是我的意思所以你的问题是:它允许或不允许修改?你的问题文本与你的注释代码冲突