2013-02-07 62 views
0

我有一个链接列表类列表。我必须为它制作复制构造函数。我实际上遇到了语法问题。这里是我的代码:链接列表类的复制构造函数

template <class T> 
List<T>::List(const List<T>& otherList) 
{ 
} 

otherList是另一种类型的List。事实上,我认为这是一个指向List的指针。我有一个为类List定义的getHead()函数,它的工作正常。 我想执行以下操作将确定:

Node* temp = otherList->getHead(); 

节点是的名单是由指针。这是一个独立的类节点。 但做上述给出了错误:

base operand of -> has non-pointer type const List<int> 

,所以我试图用“”而不是上面表达式中的“ - >”。得到了以下错误:

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; 
} 

亲切指导我

+1

是什么让你认为它是一个指针? –

+0

外来列表引用是const。因此您只能使用它的const成员,并且您从中检索的数据成员都是相同的。 – WhozCraig

回答

2

首先,otherList不是指针,它是一个 “参考const List<T>”。我们知道这是一个参考,因为它的类型为&。如果它是一个指针,它的类型将有一个*。引用的行为与您刚刚拥有对象本身的行为完全相同。因此使用.访问其成员函数getHead是正确的。

现在的问题是您有const引用,但您正在调用非const成员函数。就编译器而言,您的getHead函数可能会修改List,因此不应在const List上调用。您需要声明getHeadconst。无论你有getHead声明,开头的函数{前贴const

template <typename T> 
const Node<T>* List<T>::getHead() const { 
    // ... 
} 

这假定getHead实际上并没有修改列表(它不应该)。如果确实如此,则无法将其设置为const成员函数,因为otherListconst,所以无法从复制构造函数调用它。但是,您的拷贝构造函数不应该修改它正在拷贝的对象,所以您的otherList应该const

+0

我做了你指出的事情。但我得到了相同的错误: –

+0

传递常量列表作为ListItem的这个参数* List :: getHead()[与T = int]丢弃限定符[-fpermissive] –

+0

+1,对不起,兔子,这可能应该是'const List :: Node *',但是没有来自OP的代码,很难说。假设'Node'是一个嵌套的'List '类,这是正确的。否则你有什么。 – WhozCraig

0

我觉得getHead()应该被声明为一个const函数......试试吧,让我们知道它是否有效。