无法转换花括号包含的初始化列表

17

我在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

错误信息为:

在赋值时无法将大括号括起来的初始化列表转换为布尔型


3
你无法给普通的数组赋值。你需要一个支持这个操作的类型(std::array<std::array<bool,2>, 2>),或者手动设置每个元素的值。 - juanchopanza
3个回答

9

数组只能在定义时进行初始化,之后无法进行初始化。

要么将初始化操作移到定义处,要么手动初始化每个元素。


4
首先,您试图分配数组的具体元素而不是分配整个数组。 其次,您只能使用初始化列表进行初始化,而不能用于赋值。
以下是正确的代码:
bool Table = {{false,false},{true,false}};

0

你可以使用 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] << "\n";
    // code    
    return 0;
}

1
在C++中使用memset永远不是一个好的方法。相反,应该使用fill - user1810087
我是嵌入式开发人员,我们几乎每天都使用它。我认为这没有任何危害。 - Ankur
但这并不是 OP 想要的。 - juanchopanza
@Shansingh:在这种情况下,memset 依赖于 sizeof(bool)==1,这并不是保证的。更一般地说,它只能安全地用于平凡类型,因此如果类型在将来发生更改,则设置了触发未定义行为的陷阱。任何体面的 std::fill 实现都将尽可能高效地与 memset 相同,并且在 memset 无法正常工作时会做正确的事情;因此最好只使用它。 - Mike Seymour
@juanchopanza:我只是在提到后初始化方面。在这种情况下,我们可以使用memset。 - Ankur
近期的GCC版本警告不要在类类型上使用memset。 - mallwright

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接