我被要求将大学作业的三个班级转换为模板以使它们更通用但我在尝试从模板函数返回指向对象的指针时遇到问题。
编译器:GCC版本 - 3.4.4(Cygwin)
这是(.h):
namespace node_class
{
template <class Item>
class node
{
public:
// CONSTRUCTOR
node(const Item& initial_data = 0, node* initial_link = NULL);
~node(){}
// MUTATING MEMBER FUNCTIONS
void set_data(const Item& new_data);
void set_link(node* new_link);
// NON-MUTATING MEMBER FUNCTIONS
const node* link(void) const;
node* link(void);
const Item& data(void) const;
Item& data(void);
private:
Item data_field;
node* next_field;
};
}
以下是返回指向对象的指针的两个函数实现:
template<class Item>
const node<Item>::node* node<Item>::link(void) const
{
return(next_field);
}
template<class Item>
node<Item>::node* node<Item>::link(void)
{
return(next_field);
}
以下是我在尝试编译时不断抛出的错误:
$ g++ -Wall node.h
node.h:73: error: expected init-declarator before '*' token
node.h:73: error: expected ';' before '*' token
node.h:79: error: expected constructor, destructor, or type conversion before '*' token
node.h:79: error: expected ';' before '*' token
目前,我有一个单独的(.h)和(。模板),头文件中的include指令包含.template;但是,即使模板函数的实现包含在(.h)中,我仍然会得到这些相同的错误消息。
任何帮助都会很棒,谢谢。
答案 0 :(得分:5)
node<Item>::node
不是一种类型。返回类型node<Item>*
。
方法声明应为:
const node<Item>* link(void) const;
node<Item>* link(void);
这些方法的定义应该是:
template<class Item>
const node<Item>* node<Item>::link(void) const
{
return(next_field);
}
template<class Item>
node<Item>* node<Item>::link(void)
{
return(next_field);
}
答案 1 :(得分:1)
node<Item>::node*
应该是node<Item>*
:
template<class Item>
const node<Item>* node<Item>::link(void) const
{
return(next_field);
}
template<class Item>
node<Item>* node<Item>::link(void)
{
return(next_field);
}
您似乎对模板的工作方式感到困惑,因此我将概述:
首先要理解的是:没有类名节点。一个都没有。有一个名为 template 的类名为node。这是什么意思?对于应用于此模板的每种类型Item
,都有一个名为node<Item>
的对应类。要重复:如果Item
是一种类型,则node<Item>
是一个类,但node
从不一个类。
但是您可能想知道“如果node
不是类型,为什么我可以像类型一样使用它?”,如
template<class Item>
class node
{
node* next_field;
};
但是在这里,node
只是node<Item>
的简写。不要因为看起来而感到困惑,因为node
是一种类型。