2017-08-29 80 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