c++ - 为什么在定义一对数组时需要额外的一对花括号?
问题描述
很抱歉,如果这是一个常见问题,我不知道如何搜索它,所以我认为最好只是问。
我想在 C++ 中定义一个std::array
of std::pair
s 来存储 SFML sf::IntRects
。我把它弄乱了大约 10 分钟,最后意识到它可以编译:
std::array<std::pair<sf::IntRect, sf::IntRect>, 1> aliens{
{
{sf::IntRect{2,3,1,2}, sf::IntRect{4,1,3,2}}
}
};
为什么我需要在这对本身周围加上一组额外的花括号?当我把它们带走时:
std::array<std::pair<sf::IntRect, sf::IntRect>, 1> aliens{
{sf::IntRect{2,3,1,2}, sf::IntRect{4,1,3,2}}
};
我收到一个错误No suitable user-defined conversion from "sf::IntRect" to "std::pair<sf::IntRect,sf::IntRect>" exists
这些花括号在做什么?我无法想象他们需要什么。
解决方案
std::array是内置 C 样式数组的包装模板。你可能会认为它像
template <typename T, std::size_t N>
class array {
T arr[N];
...
};
std::array
和内置的 C 样式数组都是聚合类型。您使用聚合初始化语法对其进行初始化。会是这样的
std::array<T, N> array = {{ t0, t1, t2 }};
外部{}
用于std::array
自身,内部{}
用于包装的内置 C 样式数组。
看看你的例子
std::array<std::pair<sf::IntRect, sf::IntRect>, 1> aliens{
{sf::IntRect{2,3,1,2}, sf::IntRect{4,1,3,2}}
};
如下重新格式化时,错误更加明显。
std::array<std::pair<sf::IntRect, sf::IntRect>, 1> aliens{{
sf::IntRect{2,3,1,2},
sf::IntRect{4,1,3,2}
}};
您正在尝试使用单个sf::IntRect
对象初始化一对。
推荐阅读
- gif - 保存 GIF 并保留路径 - 有可能吗?
- javascript - 即使关闭,音频也会自动播放
- c - 将数据添加到文件 C 中的行尾(不使用第二个文件)
- java - 我想使用 DateTimeFormatterBuilder () 将日期从 String 转换为 LocalDateTime
- spfx - Graph API 读取资源/会议室日历
- windows - Powershell启动需要很长时间
- python - Pyspark - 将具有不同架构的文件合并到一个主文件中
- python - 不使用 ocr python selenium 显示图像中的任何文本,而不会在脚本中显示错误
- linux - 等待进程退出而不获取 pid
- linux - 如何解决错误连接数据库?