Elem没有命名类型



我有一个很简单的问题,通常我可以自己调试,但此时我似乎遇到了很大的问题。

我正在创建一个链表数据结构,我做了两个函数,一个返回前面的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的答案有效。

  1. 排序错误,因此您在定义之前已经使用了类型Elem。您至少必须告诉编译器,它存在,并且它是类的嵌套类型。否则,它将走到那个地步,不知道该怎么办。

  2. 您的struct Elem是私人的。也就是说,这种类型只能在同一类的私有部分中看到,就像privat变量一样。您从公共方法返回此结构,因此返回值是一个公共部分,在该部分无法看到此结构。只更改排序,但不同时将类型设为公共,这意味着您可以调用simpleList::front()simpleList::back(),但不能将返回类型存储在任何位置(因为这需要一个具有私有类型的变量)。

  3. 您的返回值声明中有重复的作用域说明符。这不是一个错误,但它们并不是真正必要的,可能会混淆其他人。通常在类级别,您只需直接使用嵌套类型,而不需要额外的作用域说明符。

因此,在这种情况下,重要的不仅仅是顺序,而是错误的实际组合。计数1会导致您看到的编译器错误,计数2会导致您的方法不可用,并可能在其他地方导致编译器错误,而计数3只是美观。

相关内容

  • 没有找到相关文章

最新更新