Список фиксированных размеров - PullRequest
1 голос
/ 01 мая 2011

Я пишу класс FixedSizeList, используя фиксированный массив.У меня проблема с параметром шаблона фиксированного размера, и я пытаюсь понять, является ли мое решение правильным и даже как я могу решить свою проблему.

По сути, это скелет моего класса:1003 *

#pragma once

template <typename T, unsigned int N>
class SListFixed
{
public:
    SListFixed();

private:
    template <typename T>
    struct Node
    {
        Node(T value)
            :element(value), nextElement(0)
        {
        }

        T element;
        int nextElement;
    };

    Node m_data[N];
    int m_head;
    int m_tail;
    size_t m_elementCounter;
};

Первый вопрос касается правильности этой структуры.Тогда я хочу понять, почему этот код не компилируется.Должен ли я сделать указатель m_data и выделить его в стеке?

Спасибо.

Ответы [ 3 ]

2 голосов
/ 01 мая 2011

Чтобы компилировать это, измените

Node m_data[N];

на

Node<T> m_data[N];

Поскольку Node, в конце концов, является шаблоном класса.

Тем не менеепростое выполнение того, что сказал Оли и удаление template <typename T> из определения Node, также будет работать, потому что T известно из экземпляра FixedSizeList.Я бы порекомендовал сделать это, потому что тип Node никогда не мог отличаться от типа FixedSizeList.

Хотя этот ответ настолько очевиден, что я сомневаюсь, что отвечаю на ваш вопрос.Скажи мне, если я что-то пропустил.

0 голосов
/ 01 мая 2011

Список по определению является контейнером переменного размера.Почему бы вам просто не использовать класс array ?

0 голосов
/ 01 мая 2011

Трудно точно сказать, является ли это хорошим решением, но внешне оно выглядит нормально (несмотря на ошибки компилятора). Хотя я не совсем уверен, почему вы хотите список фиксированного размера; не весь смысл списка в том, что вы можете динамически изменять его размер? Почему не просто массив / вектор?

Что касается ваших проблем компиляции, вам не нужно template <typename T> для внутреннего класса; это уже часть шаблона, а T уже известен. Кроме того, у вас нет конструктора по умолчанию для Node, поэтому Node m_data[N] не будет компилироваться.

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