返回指向对象的指针(c++模板)错误
Returning a pointer to an object ( C++ Templates ) Error
我被要求将大学作业的三个类切换到模板,以使它们更通用,但当我试图从模板函数返回指向对象的指针时,我遇到了问题。
编译器:GCC Version - 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)和(.template)与。模板被包含在头文件中的包含指令;但是,即使模板函数的实现像它应该的那样包含在(.h)中,我仍然得到这些相同的错误消息。
任何帮助将是伟大的,谢谢你。
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);
}
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);
}
编辑
你似乎对模板的工作方式有点困惑,所以我将给出一个概述:
首先要理解的是:没有类名节点。一点也没有。有一个名为node的类模板。这是什么意思?对于应用于此模板的每种类型Item
,都有一个名为node<Item>
的对应类。重复一下:如果Item
是一个类型,那么node<Item>
是一个类,但node
是绝不是类。
但是你可能想知道"如果node
不是一个类型,为什么我可以像使用类型一样使用它?",如
template<class Item>
class node
{
node* next_field;
};
但在这里,node
只是node<Item>
的简写。不要因为它看起来像node
是一个类型而感到困惑。
相关文章:
- .cpp和.h文件中的模板专用化声明
- C++模板来检查友元函数的存在
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- 部分定义/别名模板模板参数
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 如何在c++中为模板函数实例创建快捷方式
- 使用C++中的模板和运算符重载执行矩阵运算
- 有人能分解一下这个c++模板的语法吗
- 如何在c++17中制作一个模板包装器/装饰器
- 模板化建造师专业化
- 调用专用模板时出错"no matching function for call to [...]"
- 模板元程序查找相似的连续类型名称
- 如何在C++20中创建模板别名的推导指南
- 没有名称的C++模板参数
- 具有重复类型的C++可变模板
- 如何将enable-if与模板参数和参数包一起使用
- 没有用于初始化C++中的变量模板的匹配构造函数