我不知道为什么我得到这个错误:List .cpp:127:错误:' class List '没有名为' curr '的成员
template <class T>
List<T> List<T>::mixSplit()
{
List<T> * newList;
class List<T>::ListNode * curr = head;
newList->length=0;
newList->length-3;
newList->head = NULL;
newList->tail=NULL;
for (int count=0;count<1;count++)
newList->curr=newList->curr->next;
newList->head=newList->curr;
newList->tail=tail;
tail=newList->curr->prev;
tail->next=NULL;
newList->head->prev=NULL;
newList->tail->next=NULL;
return newList;
}
错误发生在
newList->curr=newList->curr->next;
当我这样做时:
class List<T>::ListNode * curr = head;
这难道不允许curr
成为newList
的头吗?
编辑:下面是类定义:
template <class T>
class List
{
private:
class ListNode
{
public:
// constructors; implemented in list_given.cpp
ListNode();
ListNode(T const & ndata);
// member variables
ListNode * next;
ListNode * prev;
const T data; // const because we do not want to modify node's data
};
类List
没有成员curr
,这就是错误提示。我很确定这个类确实没有这个成员。
在不同的作用域中存在另一个具有相同名称的变量,这是无关的。
用typename
代替class
:
typename List<T>::ListNode * curr = head; //correct
//class List<T>::ListNode * curr = head; //incorrect
这是一个不能用class
代替typename
的例子。
error: List .cpp:127: error: ' class List '没有名为' curr '的成员
从错误中可以清楚地看出模板的定义在.cpp
文件中。这是问题的另一个原因。不能在另一个文件中提供模板的定义。声明和定义应该在同一个文件中。因此,将所有的定义移动到头文件
问题是List<T>
里面没有curr
这样的成员!你误解了,curr
是List<T>::ListNode
的成员!! !
仅仅在class
中声明class
并不意味着所有的内部类成员也都委托给外部类,反之亦然。你需要在List<T>
里面有ListNode* curr;
来完成这个。
在解决编译错误之后,您将最终解决运行时错误,因为您的类还有其他几个问题。例如,
List<T> * newList; // dangling/uninitialized pointer
class List<T>::ListNode * curr = head; // curr is unused and pointing to something unknown
必须初始化newList = new List<T>;
来使用指针。或者您可以将自动对象声明为List<T> newList;
。