如果这是一个常见的问题,我很抱歉,我不知道我该如何搜索它,所以我想最好还是问一下。
我想在c++中定义std::pair
s的std::array
来存储SFMLsf::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
对象初始化一对。