Можно ли определить количество элементов члена класса std::array во время создания объекта?

Я хочу написать класс, чьи объекты будут строковыми таблицами с фиксированным числом столбцов. Поскольку количество столбцов будет оставаться неизменным в течение всего времени существования объекта, я решил объявить каждый объект строки из std::array контейнеры.

Код ниже - моя попытка написать такой класс.

class Table
{
    public:
        Table(size_t ColumnCount)   // LINE 45
        {
            // The constant 'N' in the template definitions
            // will be equal to the 'ColumnCount' parameter.
        }
        template <uint64_t N>
        void AddRow(const std::array<std::wstring, N> & NewRow)
        {
            Rows.push_back(NewRow);
        }
    private:
        template <uint64_t N>       // LINE 55
        std::list<std::array<std::wstring, N>> Rows;
};

Table mytable(5);   // Create a table with 5 columns

Я получаю ошибки (в Visual Studio 2012):

Line 55: error C3857: 'Table::Rows': multiple template parameter lists are not allowed
Line 45: error C2512: 'std::list<std::array<std::wstring,N>>' : no appropriate default constructor available

Можно ли заставить этот код работать?

1 ответ

Решение

Да, ты можешь. Просто поместите ваш параметр шаблона поверх класса, а не там, где объявление члена выглядит так:

template <uint64_t N>
class Table
{
    public:
        Table()   // LINE 45
        {
            // The constant 'N' in the template definitions
            // No need for an external variable
        }
        void AddRow(const std::array<std::wstring, N> & NewRow)
        {
            Rows.push_back(NewRow);
        }
    private:
        // Not here
        std::list<std::array<std::wstring, N>> Rows;
};

затем использовать его, вы просто делаете Table<5> stuff; Это сделало бы его постоянной времени компиляции. Ваш код не работает, потому что вы не можете иметь параметры шаблона для отдельных членов, так как они должны быть вместо этого в объявлении класса.

Другие вопросы по тегам