Как шаблонно структурировать структуру данных внутри класса (тот же файл .h) - PullRequest
1 голос
/ 28 сентября 2019

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

Когда я пытаюсь собрать, я получаю ошибки при каждом упоминании LLnode, fwdPtr и theData.Это каждый элемент структуры, поэтому я сделал что-то очень неправильное.Кроме того, само определение struct помечено syntax error

template <class V>
class LL
{
    private:
        LLnode * header;
        struct <V> LLnode;
        {
            LLnode * fwdPtr; // has a pointer member
            V theData; // the data within the node
        };

    public:
        LL()
            {
                header = nullptr;
            }
        void push_front(string data)  
        {
            LLnode * new_node;
            new_node = new LLnode;                          
            new_node -> theData = data;                     

            if (header == nullptr)                      
            {                                               
                header = new_node;                    
                new_node -> fwdPtr = nullptr;
            }
            else                                            
            {
                LLnode * temp;                              
                temp = header;                          
                header = new_node;                      
                new_node -> fwdPtr = temp;                  
            }

            return;
        }
        .... more functions below ....

. В main(), на котором будет проверяться функция, будет создан новый связанный список с приведением <string>как тип.Вот почему я переместил struct LLnode в секцию private члена class LL.По этой же причине я использую V по всей структуре.Поскольку это приведение должно достигать самой структуры, поэтому, когда я динамически распределяю память для узлов, она будет знать, что она будет принимать string data

. Я знаю, что мне нужно будет изменить определения функций, чтобы они включали V ииспользуйте V повсюду с некоторыми переменными.Но я не понимаю, где и почему.Я запутался в том, как классы шаблона связаны со структурами указателей и программистов.Я понимаю простые примеры шаблонных классов / функций в моем учебнике, но я здесь потерян.

Заранее спасибо за любую помощь!

РЕДАКТИРОВАТЬ: Вот сообщения об ошибках, которые я получаю (в соответствии с просьбой)

../LL_template_class.h:23:3: error: unknown type name 'LLnode'
                LLnode * header;
                ^
../LL_template_class.h:24:3: error: declaration of anonymous struct must be a definition
                struct <V> LLnode;
                ^
../LL_template_class.h:24:3: warning: declaration does not declare anything [-Wmissing-declarations]
../LL_template_class.h:25:3: error: expected member name or ';' after declaration specifiers
                {
                ^
../LL_template_class.h:37:4: error: unknown type name 'LLnode'
                        LLnode * new_node;
                        ^
../LL_template_class.h:38:19: error: unknown type name 'LLnode'
                        new_node = new LLnode;
                                       ^
../LL_template_class.h:48:5: error: unknown type name 'LLnode'
                                LLnode * temp;

Но, как я уже сказал, я получаю can not resolve ошибки во всех упоминаниях моих struc LLnode элементов

1 Ответ

1 голос
/ 28 сентября 2019

Две проблемы:


Во-первых, вы слишком рано заканчиваете объявление struct LLnode (у вас есть лишняя точка с запятой).У вас есть

struct LLnode;
{
...
};

У вас должно быть

struct LLnode
{
...
};

Во-вторых, у вас есть объявление struct <V> LLnode, когда вы должны иметь объявление struct LLnode.Наличие <V> не имеет синтаксического смысла.


Кроме того, я не уверен, если это необходимо, но вам может потребоваться переместить ваше объявление header ниже вашего объявления LLnode, поскольку header определяется как LLnode.

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