Я хочу написать класс, чьи объекты будут строковыми таблицами с фиксированным числом столбцов. Поскольку количество столбцов будет оставаться неизменным в течение всего времени существования объекта, я решил объявить каждый объект строки из 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
Можно ли заставить этот код работать?
Да, ты можешь. Просто поместите ваш параметр шаблона поверх класса, а не там, где объявление члена выглядит так:
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;
Это сделало бы его постоянной времени компиляции. Ваш код не работает, потому что вы не можете иметь параметры шаблона для отдельных членов, поскольку они должны быть вместо этого в объявлении класса.
Других решений пока нет …