gpt4 book ai didi

c++11 - vector 不转换大括号括起来的列表

转载 作者:行者123 更新时间:2023-12-02 07:21:09 25 4
gpt4 key购买 nike

我做了一个 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. 添加一个采用std::initializer_list<std::initializer_list<T>>的构造函数
  2. 用另一组 {} 封闭 init 表达式即

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

好的,我会试着解释一下这里发生的事情:

如果没有构造函数采用 std::initializer_list然后是最外面的{}如果你愿意,总是打开和关闭构造函数调用,而不是你实际传递给构造函数的部分。

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

如您所见,这被视为具有 2 个参数的构造函数,在本例中为 2 个 initializer_lists。

这就是为什么您需要另一组 {} 的原因:

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

为了最外层{}被认为是一个 initializer_list 那么构造函数需要有一个重载 initializer_list .这就是 std::vector 中发生的事情。案例。

关于c++11 - vector 不转换大括号括起来的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45939190/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com