【问题标题】:Cannot convert Brace-enclosed initializer list无法转换大括号括起来的初始值设定项列表
【发布时间】:2014-05-13 11:58:06
【问题描述】:

我声明一个布尔值表并在main()中初始化它

const int dim = 2;
bool Table[dim][dim];

int main(){

     Table[dim][dim] = {{false,false},{true,false}};
     // code    
     return 0;
}

我使用mingw 编译器,构建器选项是g++ -std=c++11。 错误是

不能在赋值中将大括号括起来的初始值设定项列表转换为“bool”`

【问题讨论】:

  • 您不能分配给普通数组。你需要一个支持它的类型 (std::array<std::array<bool,2>, 2>),或者手动设置元素。

标签: c++ arrays variable-assignment


【解决方案1】:

数组只能在定义时这样初始化,之后不能这样做。

要么将初始化移动到定义中,要么手动初始化每个条目。

【讨论】:

    【解决方案2】:

    首先,您尝试分配数组的具体元素,而不是分配整个数组。 其次,初始化器列表只能用于初始化,不能用于赋值。

    这是正确的代码:

    bool Table = {{false,false},{true,false}};
    

    【讨论】:

      【解决方案3】:

      您可以为此使用memset(Table,false,sizeof(Table))。它可以正常工作。

      这是你的完整代码

      #include <iostream>
      #include<cstring>
      using namespace std;
      
         const int dim = 2;
          bool Table[dim][dim];
      
          int main(){
      
               memset(Table,true,sizeof(Table));
               cout<<Table[1][0];
      // code    
      return 0;
          }
      

      【讨论】:

      • memset 与 c++ 从来都不是一个好方法。请改用fill
      • 嗯,我是嵌入式开发人员,我们几乎每天都在使用它。我认为它没有害处。
      • 但这并不能满足 OP 的要求。
      • @Shansingh:在这种情况下,memset 依赖于sizeof(bool)==1,这并不能保证。更一般地说,它只能安全​​地用于琐碎的类型,因此您正在设置死亡陷阱以在将来类型更改时触发未定义的行为。 std::fill 的任何体面实现都将尽可能与memset 一样高效,并且当memset 不会做正确的事情时;所以最好只使用它。
      • @juanchopanza :我只是在后期初始化方面表明这一点。在这种情况下我们可以使用memset。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-21
      • 2011-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-06
      相关资源
      最近更新 更多