我的学校项目存在问题。我们正在学习一些数据结构概念,并给出了一些定义模板类的代码。教授给出的语法不正确,我研究并最终解决了这个问题。当我尝试解决方案时,我在这里输入了一个问题。最终我解决了这个问题,并认为我应该保留问题并发布它,创建一个我可以展示自己的思维过程的线程,并为其他人提供一个场所,以展示他们自己的技术和思考过程中的模板类。我承认,我不确定Stack Overflow上是否有这样的地方,但我认为这里可能是一个不错的地方。
所以我有一个使用单链表的作业,我们已经提供了定义3个类的代码:List
,ListItr
和ListNode
。
每个类都是一个模板,允许列表采用任何类类型。定义如下:
列表
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 '>'
我还注意到一个单独的问题,但这不是我遇到的大问题,所以在本次讨论中可以忽略它。
问题是编译器不会将类List
,ListItr
或ListNode
识别为类型。经过一些研究,我尝试了这些原型来解决这个问题,正如我所理解的那样,在声明模板函数的方法中存在语法错误。网上没有很多例子显示了正确和错误方法之间的比较,所以这里有一些我试过的:
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, ...)
如果我错过了某些内容,或者此处有任何不正确之处,请发表评论/回答,以便澄清不一致之处。