【问题标题】:Using multidimensional std::initializer_list使用多维 std::initializer_list
【发布时间】:2012-04-09 04:19:05
【问题描述】:

我有一个关于在 C++ 中使用多维 std::initializer_list 的问题。我有一个 Matrix 类,我希望能够像这样初始化它:

Matrix<int, 3, 3> m({{1, 2, 3}, {4, 5, 6}, {7, 8, 9}});

我现在拥有的构造函数接受二维初始化列表的参数,但编译器不喜欢我使用它的方式。代码如下:

template<typename T, unsigned int rows, unsigned int cols>
Matrix<T, rows, cols>::Matrix(std::initializer_list<std::initializer_list<T> > set)
{
    std::vector<std::initializer_list<T> > setVec = set;
    std::vector<std::vector<T> > v;

    for (std::vector<std::initializer_list<T> >::iterator i = setVec.begin(); i != setVec.end(); i++)
    {
        v.push_back(std::vector<T>(*i));
    }

    this->matrixData = new T*[rows];

    for (unsigned int i = 0; i < rows; i++)
    {
        this->matrixData[i] = new T[cols];

        for (unsigned int j = 0; j < cols; j++)
        {
            this->matrixData[i][j] = v[i][j];
        }
    }
}

这是错误:

..\/utils/Matrix.h:138:7: error: need 'typename' before 'std::vector<std::initializer_list<_CharT> >::iterator' because 'std::vector<std::initializer_list<_CharT> >' is a dependent scope

如何消除该错误?有没有办法重组它,这样我就不必制作初始化列表或其他东西的丑陋向量?

【问题讨论】:

  • 您是否尝试过阅读错误信息
  • 是的,我不太明白它的要求。

标签: c++ multidimensional-array matrix c++11 initializer-list


【解决方案1】:

是的,正如错误信息所说,你需要在这里写typename

typename std::vector<std::initializer_list<T>>::iterator i = setVec.begin();

这是因为iterator 是一个从属名称。阅读此内容以获得详细说明:

如果你的编译器支持 C++11 引入的auto,那么你可以这样写:

auto i = setVec.begin();

这是更好的语法。由于您已经在使用 C++11 功能,例如 std::initializer_list,因此您应该开始使用 auto,只要它能让您的生活更轻松。

【讨论】:

    猜你喜欢
    • 2012-11-20
    • 1970-01-01
    • 1970-01-01
    • 2020-06-11
    • 1970-01-01
    • 1970-01-01
    • 2013-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多