假設我有一個Matrix類,我想初始化有兩種方式我Matrix對象:如何使用非嵌套和嵌套的initializer_list參數來區分兩個重載函數?
Matrix a = {1,2,3} // for a row vector
和
Matrix b = {{1,2,3},{4,5,6},{7,8,9}} // for a matrix
結果,我實現了兩個拷貝構造函數如下
class Matrix {
private:
size_t rows, cols;
double* mat;
public:
Matrix() {}
Matrix(initializer_list<double> row_vector) { ... }
Matrix(initializer_list< initializer_list<double> > matrix) { ... }
...
}
無論我如何更改界面,例如添加explicit
關鍵字或將嵌套版本更改爲Matrix(initializer_list< vector<double> > matrix)
。它總是會引起歧義這兩種情況之間:
Matrix a = {1,2,3};n
Matrix b = {{1}, {2}, {3}};
我不是很熟悉,如直接/拷貝初始化或隱式類型轉換的東西。有沒有解決這個問題的方法?
您是否試圖根據輸入調整您的矩陣大小?例如,你是否期望'{1,2,3}'產生一個3x1向量,並且'{{1,2,3},{4,5,6},{7,8,9}}'產生一個3x3矩陣? –
@JonathanMee絕對。 – pedim
@pedim所以有點令人驚訝,如果你使用Visual Studio *,它會*選擇第三個構造函數。我在這裏打開一個關於它的問題:http://stackoverflow.com/q/38795374/2642059 –