返回指向对象的指针(c++模板)错误

Returning a pointer to an object ( C++ Templates ) Error

本文关键字:c++ 模板 错误 指针 对象 返回      更新时间:2023-10-16

我被要求将大学作业的三个类切换到模板,以使它们更通用,但当我试图从模板函数返回指向对象的指针时,我遇到了问题。

编译器: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是一个类型而感到困惑。