标识符和模板的问题:我的思维过程和解决方案

时间:2018-02-06 03:13:33

标签: c++ templates types compiler-errors linked-list

我的学校项目存在问题。我们正在学习一些数据结构概念,并给出了一些定义模板类的代码。教授给出的语法不正确,我研究并最终解决了这个问题。当我尝试解决方案时,我在这里输入了一个问题。最终我解决了这个问题,并认为我应该保留问题并发布它,创建一个我可以展示自己的思维过程的线程,并为其他人提供一个场所,以展示他们自己的技术和思考过程中的模板类。我承认,我不确定Stack Overflow上是否有这样的地方,但我认为这里可能是一个不错的地方。

所以我有一个使用单链表的作业,我们已经提供了定义3个类的代码:ListListItrListNode
每个类都是一个模板,允许列表采用任何类类型。定义如下: 列表

template <class Object> class List
{
public:
    List();
    List(const List * rhs);
    ~List();

    bool isEmpty() const;
    void makeEmpty();
    ListItr<Object> zeroth() const; //errors thrown here
    ListItr<Object> first() const;  //errors thrown here
    void insert(const Object & x, const ListItr <Object> & p); //errors thrown here
    ListItr<Object> find(const Object & x) const; //errors thrown here
    ListItr<Object> findPrevious(const Object & x) const; //errors thrown here
    void remove(const Object & x);
    const List & operator = (const List & rhs);
private:
    ListNode<Object> * header; //errors thrown here
};

ListItr

template <class Object> class ListItr
{
public:
    ListItr() : current(NULL){}
    bool isPastEnd() const
    {return current == NULL;}
    void advance()
    {
        if(!isPastEnd()) current = current->next;
    }
    const Object & retrieve() const
    {
        if(isPastEnd()) throw BadIterator();
        return current->element;
    }
private:
    ListNode <Object> *current; //errors thrown here
    ListItr(ListNode<Object> *theNode) : current(theNode) {} //different error here
    //here it complains that ListItr member function already defined
    friend List<Object>;
};

ListNode

template <class Object> class ListNode
{
    ListNode(const Object & theElement = Object(), ListNode * n = NULL) : element(theElement), next(n)
    {}
    Object element;
    ListNode *next;
    friend List<Object>;
    friend ListItr<Object>;
};  

为了清除混淆,我无法使用std::list,因为它使用双向链接列表 我尝试编译时,我评论了所有引发错误的区域。编译器注意到:

C4430: missing type specifier - int assumed...
C2238: unexpected token(s) preceding ';'
C2143: syntax error : missing ';' before '>'

我还注意到一个单独的问题,但这不是我遇到的大问题,所以在本次讨论中可以忽略它。
问题是编译器不会将类ListListItrListNode识别为类型。经过一些研究,我尝试了这些原型来解决这个问题,正如我所理解的那样,在声明模板函数的方法中存在语法错误。网上没有很多例子显示了正确和错误方法之间的比较,所以这里有一些我试过的:

ListItr zeroth() const;

ListItr<class Object> zeroth() const;

ListItr<class> zeroth() const;

ListItr<Object> Object zeroth() const;

这些都是不正确的,因为它们专注于ListItr,而不是函数及其返回类型本身,并且在每个原型中都进行了太多的讨论。

正确的语法只描述类型,函数名称和输入类型:

Object zeroth() const;

您会注意到每个模板都使用

系统
template <class Object> class NAME

因此,在返回泛型类型的函数中,唯一需要的声明是正在使用的泛型的名称,在本例中为Object
就我而言,我不确定代码中使用const的原因,但可以忽略它来描述声明泛型返回类型函数的通用语法。 /> 因此,总而言之,声明具有泛型返回类型的函数的正确语法如下:

template <class Object> class Name
Object function(type1, type2,...);

使用泛型返回类型定义函数的正确语法如下:

template <class Object> class Name
template <class Object> Object Name<Object>::function(type1 parameter1, type2 parameter2, ...)

如果我错过了某些内容,或者此处有任何不正确之处,请发表评论/回答,以便澄清不一致之处。

0 个答案:

没有答案