2017-08-29 51 views
2

我做了一个Matrix类这种类型的构造函数:矢量不转换撑罩壳列表

Matrix<T>(const vector<vector<T>> &m) 

如果我这样做,我可以实例Matrix对象:

vector<vector<double>> a_v { 
     { 17, 24, 1}, 
     { 23, 5,  7 }, 
     { 4,  6, 13 } 

    }; 

    Matrix<double> a=a_v; 

它工作正常,但我认为该che构造应该作为类型转换器,我认为这个代码也应该工作:

Matrix<double> a= { 
    { 17, 24, 1}, 
    { 23, 5,  7 }, 
    { 4,  6, 13 } 

}; 

然而与此第二个代码我得到这个错误:

could not convert ‘{{17, 24, 1}, {23, 5, 7}, {4, 6, 13}}’ from 'brace-enclosed initializer list' to ‘Matrix’

为什么C++11不转换brace-enclosed initializervector<vector<double>>自动?

如果我想以这种方式初始化矩阵,该怎么办?

+1

可能相关https://stackoverflow.com/questions/15810171/is-there-a-way-to-pass-nested-initializer-lists-in-c11-to-construct-a-2d-matri –

回答

7

你有两个选择:

  1. 添加一个构造采取std::initializer_list<std::initializer_list<T>>
  2. E关闭初始化表达式与另一组的{}

    Matrix<double> a{{ 
        { 17, 24, 1}, 
        { 23, 5,  7 }, 
        { 4,  6, 13 } 
    }}; 
    

好吧,我会尽力对这里发生的事情的一点解释:

如果没有构造函数采用std::initializer_list,那么最外层的{}总是打开和关闭构造函数调用,如果您愿意,而不是实际传递给构造函数的部分。你可以看到这是一个带有2个参数的构造函数,在这个例子中是2个initializer_lists。

这就是为什么你需要另一套{}

Matrix<double> a{ {{1, 2}, {3, 4}} }; 
       ^^~~~~~~~~~~~~~~~^
       | 1 parameter  | 
       |     | 
       |     | 
      opening   closing 

为了使最{}要考虑的initializer_list然后构造需要有一个过载采取initializer_list。这就是std::vector的情况。

+0

I老实说,现在没有足够的能量来通过标准来查看所有在这里发挥作用的规则,所以直到有人解释这里发生了什么事情,你才可以看到这一点。 – bolov

+0

谢谢,它的工作原理,但为什么它需要另一套'{}'? – Andrea993

+0

我没有检查标准,所以我可能会更多或更少错误 – bolov