是否可以在对象实例化期间定义std :: array类成员的元素计数?

时间:2013-08-01 20:31:48

标签: c++ c++11 stdarray

我想编写一个类,其对象将是具有固定列数的字符串表。由于列数在对象的生命周期内将保持不变,因此我决定从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 个答案:

答案 0 :(得分:2)

是的,你可以。只需将模板参数放在类的顶部而不是成员声明的位置:

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;这将使它成为编译时常量。您的代码不起作用,因为您不能拥有单个成员的模板参数,因为它们必须在类声明中。