作为关键c ++的对象指针映射上的迭代器

时间:2015-11-16 09:40:04

标签: c++ pointers iterator

我正在实施一个回溯算法来解决sudokus,但我在使用地图时遇到了一些问题。 任何人都可以告诉我为什么我在编译代码时会遇到这两个错误?第一个错误是关于在地图上声明迭代器的行。第二个是在做Adj[&node] = mList;

错误:

错误C2664'std :: _ Tree_const_iterator>>> std :: _ Tree> :: find(Node * const&)const':无法将参数1从'const Node *'转换为'Node * const&'

错误C2679'['binary:没有操作符发现接受'const Node *'类型的右操作数(ou没有可接受的转换)

(我的Visual Studio是法语的,所以我翻译了错误信息。希望这样很好)

我收到错误的代码:

template<class T>
void AdjList<T>::addElement(const Node<T>& node, const vector<Node<T>>& vecOfNeighbours) {
    typename map< Node<T>*, LinkedList<T>>::iterator mit = Adj.find(&node);
    if (mit!=Adj.end()) {
        LinkedList<T> mList;
        for (typename vector<Node<T>>::const_iterator it = vecOfNeighbours.begin(); it != vecOfNeighbours.end(); it++) {
            mList.Add((*it).getValue()[0]);
        }
        Adj[&node] = mList;
    }
}

我的课程定义:

template<class T>
class AdjList
{
private:
    map<Node<T>*, LinkedList<T>> Adj;
public:
    AdjList();
    AdjList(const AdjList<T>& adjlist);
    AdjList(const Node<T>& node, const vector<Node<T>>& vecOfNeighbours);
    void addElement(const Node<T>& node, const vector<Node<T>>& vecOfNeighbours);
    void Print() const;
};

template<class T>
class LinkedList
{
    Node<T>* head;
    int  getEndList();
    Node<T>* returnFrontEnd(void) const;

public:
    LinkedList();
    LinkedList(T data);
    LinkedList(const LinkedList<T>& list);
    LinkedList<T>& operator=(const LinkedList<T>& list);
    void Add(T data);
    void AddAt(int index, T data);
    void Print();
    ~LinkedList();
};

template<class T>
class Node
{
protected:
    vector<T> _value;
    Node<T>*  child;

public:
    Node(T value);
    void addValue(T value);
    Node<T>* clone() const;
    Node(const Node<T>& node);
    vector<T> getValue() const;
    Node<T>* returnChild() const;
    void AddChild(const Node<T>& node); 
    Node& operator=(const Node<T>& node);
    ~Node();
};

1 个答案:

答案 0 :(得分:0)

你需要抛弃const。为什么?看看:

void AdjList<T>::addElement(const Node<T>& node, const vector<Node<T>>&) 

好的,node是一个const引用,

typename map< Node<T>*, LinkedList<T>>::iterator mit = Adj.find(&node);

但是这个迭代器将有一个非const指针。因此,如果允许这样做,您将能够从const引用中获取非const指针。这显然需要抛弃const(你不这样做)。