使用多维的std::initializer_list

5

我有一个关于C++中多维std::initializer_list使用的问题。我有一个矩阵类,我想要像这样初始化它:

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

我该如何消除这个错误?是否有一种重构方法,使我不必创建一个丑陋的向量初始化列表或其他东西?


4
你有没有真正尝试“阅读错误信息”? - ildjarn
1
是的,我没有完全理解它要求的内容。 - Publius
1个回答

8

是的,就像错误信息所说,你需要在这里写上 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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接