我正在做家庭作业,我们不允许使用任何STL容器。我对LinkedList的实现是一系列与指针链接在一起的节点。我有另一个名为ContinuousList的类,它有一个数据成员LinkedList,其节点包含指向各种其他LinkedLists中的节点的指针。我正在尝试将一个返回指向Node的指针的函数的返回值赋给一个变量,该变量也是指向Node的指针,但它说这是无效的,我不明白为什么我不能做这一点。
template <typename ValueType>
struct Node
{
Node();
std::string m_key;
ValueType m_value;
Node<ValueType>* m_next;
};
链表类:
template <typename ValueType>
class LinkedList
{
public:
Node<ValueType>* begin()
{
return m_head;
}
private:
Node<ValueType>* m_head;
};
ContinuousList:
template <typename ValueType>
class ContinuousList
{
public:
ValueType* iterate(std::string& key)
{
m_curr = m_collection.begin(); // Error occurs here
...
}
private:
LinkedList<Node<ValueType>*> m_collection;
Node<ValueType>* m_curr;
};
完整的错误消息
1> error C2440: '=' : cannot convert from 'Node<ValueType> *' to 'Node<ValueType> *'
1> with
1> [
1> ValueType=Node<bool> *
1> ]
1> and
1> [
1> ValueType=bool
1> ]
1> Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
1> while compiling class template member function 'bool *ContinuousList<ValueType>::iterate(std::string &)'
1> with
1> [
1> ValueType=bool
1> ]
1> see reference to class template instantiation 'ContinuousList<ValueType>' being compiled
1> with
1> [
1> ValueType=bool
1> ]
答案 0 :(得分:4)
我从GCC收到的错误信息是:
cannot convert ‘Node<Node<int>*>*’ to ‘Node<int>*’ in assignment
比编译器给出的废话稍微清楚一点。
m_collection
包含节点中包含的节点。根据您计划使用的内容,可能只有LinkedList<ValueType>
,或者作业可能是m_curr = m_collection.begin()->m_value
。
此外,ContinuousList::iterate
几乎肯定会通过const
引用来论证。
答案 1 :(得分:0)
在LinkedList
定义中,您假设ValueType
为Node
参数,但在ContinuousList
中,您将Node<ValueType>
作为LinkedList
模板参数:
template <typename ValueType>
class ContinuousList
{
// (...)
LinkedList<Node<ValueType>*> m_collection;
Node<ValueType>* m_curr;
};
所以你的LinkedList
实际上是这样的:
template <typename ValueType>
class LinkedList
{
public:
Node<Node<ValueType> >* begin()
{
return m_head;
}
private:
Node<Node<ValueType> >* m_head;
};
如果你想这样做,这是显而易见的:
/*Node<ValueType>* */ m_curr = /* Node<Node<ValueType> >* */ m_collection.begin();