Возврат указателя на объект (шаблоны C ++) Ошибка - PullRequest
3 голосов
/ 29 сентября 2011

Меня попросили переключить три класса для университетского задания на шаблоны, чтобы сделать их более общими, но у меня возникают проблемы при попытке вернуть указатель на объект из функции шаблона.

Компилятор: версия 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) и (.template) с существованием .template.включается директивой include в заголовочный файл;Но я по-прежнему получаю те же сообщения об ошибках, даже когда реализация функций шаблона включена в (.h), как и должно быть.

Любая помощь будет отличной, спасибо.

Ответы [ 2 ]

5 голосов
/ 29 сентября 2011

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 голос
/ 29 сентября 2011

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);
}

Редактировать

Вы, кажется, немного запутались в том, как работают шаблоны, поэтому я дам обзор:

Первое, что нужно понять: нет узла с именем класса .Вовсе нет.Существует класс шаблон с именем узла.Что это значит?Для каждого типа Item, который вы применяете к этому шаблону, существует соответствующий класс с именем node<Item>.Повторим: если Item это тип, то node<Item> это класс, но node это никогда класс.

Но вы, вероятно, задаетесь вопросом "Если node не тип, почему я могу использовать его как тип? ", как в

template<class Item>
class node
{
        node* next_field;
};

Но здесь, node это просто сокращение для node<Item>.Не смущайтесь только потому, что выглядит как node тип.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...