我正在实施一个回溯算法来解决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();
};
答案 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(你不这样做)。