我有一个链表类列表。我必须为它制作一个复制构造函数。我实际上有语法问题。这是我的代码:
template <class T>
List<T>::List(const List<T>& otherList)
{
}
otherList是List类型的另一个项目。事实上,我认为它是一个指向List的指针。我有一个为类List定义的getHead()函数,它的工作正常。 我认为做以下事情就可以了:
Node* temp = otherList->getHead();
node是组成List的指针。这是一个单独的类Node。 但做上述操作会产生错误:
base operand of -> has non-pointer type const List<int>
所以我尝试使用“。”而不是“ - &gt;”在上面的表达中。得到以下错误:
passing const List<int> as this argument of ListItem<T>* List<T>::getHead() [with T = int] discards qualifiers [-fpermissive]
我的getHead函数:
template <class T>
node<T>* List<T>::getHead()
{
return head;
}
请指导我
答案 0 :(得分:2)
首先,otherList
不是指针,而是“const List<T>
的引用”。我们知道它是一个参考,因为它的类型为&
。如果它是一个指针,它的类型将有一个*
。引用的行为就像您只拥有对象本身一样。因此,使用.
访问其成员函数getHead
是正确的。
现在问题是您有const
引用,但是您正在调用非const
成员函数。就编译器而言,getHead
函数可能会修改List
,因此不应在const List
上调用。您需要将getHead
声明为const
。只要您声明getHead
,请在开始执行此功能的const
之前加上{
:
template <typename T>
const Node<T>* List<T>::getHead() const {
// ...
}
这假定getHead
实际上没有修改列表(它不应该修改)。如果是,则您无法将其设为const
成员函数,并且无法从复制构造函数中调用它,因为otherList
为const
。但是,您的复制构造函数永远不应该修改它正在复制的对象,因此otherList
应该为const
。
答案 1 :(得分:0)
我觉得应该将getHead()
声明为const函数...尝试并让我们知道它是否有效。