我有一个很简单的问题,通常我可以自己调试,但此时我似乎遇到了很大的问题。
我正在创建一个链表数据结构,我做了两个函数,一个返回前面的Elem,另一个返回最后的Elem。问题是编译器说Elem没有定义类型,而它定义了类型。
这里是头文件修剪下来的相关代码:
class simpleList {
public:
//Returns a pointer to the first Elem of the list
simpleList::Elem* front();
//Returns a pointer to the last Elem of the list
simpleList::Elem* back();
private:
struct Elem {
char info;
Elem *next;
};
Elem *head;
};
这里是这两个函数的.cpp文件实现:
//Returns a pointer to the first Elem of the list
simpleList::Elem* simpleList::front()
{
return head;
}
//Returns a pointer to the last Elem of the list
simpleList::Elem* simpleList::back()
{
Elem * temp = head;
while( temp -> next != 0 )
temp = temp -> next;
return temp;
}
我试着将它们范围界定到类中,并只做:
Elem* simpleList::front()
Elem* simpleList::back()
错误消息如下:simpleList.h:38:9:错误:"class simpleList"中的"Elem"未命名类型simpleList.h:41:9:错误:"class simpleList"中的"Elem"未命名类型
尝试以下顺序进行类声明:
class simpleList {
public:
struct Elem {
char info;
Elem *next;
};
//Returns a pointer to the first Elem of the list
Elem* front();
//Returns a pointer to the last Elem of the list
Elem* back();
private:
Elem *head;
};
对于您键入的代码,我会收到更多错误:http://ideone.com/c9PHc
以下是错误的细节,以及为什么Bo的答案有效。
-
排序错误,因此您在定义之前已经使用了类型
Elem
。您至少必须告诉编译器,它存在,并且它是类的嵌套类型。否则,它将走到那个地步,不知道该怎么办。 -
您的
struct Elem
是私人的。也就是说,这种类型只能在同一类的私有部分中看到,就像privat变量一样。您从公共方法返回此结构,因此返回值是一个公共部分,在该部分无法看到此结构。只更改排序,但不同时将类型设为公共,这意味着您可以调用simpleList::front()
和simpleList::back()
,但不能将返回类型存储在任何位置(因为这需要一个具有私有类型的变量)。 -
您的返回值声明中有重复的作用域说明符。这不是一个错误,但它们并不是真正必要的,可能会混淆其他人。通常在类级别,您只需直接使用嵌套类型,而不需要额外的作用域说明符。
因此,在这种情况下,重要的不仅仅是顺序,而是错误的实际组合。计数1会导致您看到的编译器错误,计数2会导致您的方法不可用,并可能在其他地方导致编译器错误,而计数3只是美观。