很抱歉,如果这是一个常见问题,我不知道如何搜索它,所以我认为最好只是问一下。
我想在 C++ 中定义一个std::arrayofstd::pair来存储 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}}
}
};
Run Code Online (Sandbox Code Playgroud)
为什么我需要在这对本身周围加上一组额外的大括号?当我把它们带走时:
std::array<std::pair<sf::IntRect, sf::IntRect>, 1> aliens{
{sf::IntRect{2,3,1,2}, sf::IntRect{4,1,3,2}}
};
Run Code Online (Sandbox Code Playgroud)
我收到一个错误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];
...
};
Run Code Online (Sandbox Code Playgroud)
和std::array内置的 C 风格数组都是聚合类型。您可以使用聚合初始化语法对其进行初始化。会是这样的
std::array<T, N> array = {{ t0, t1, t2 }};
Run Code Online (Sandbox Code Playgroud)
外部{}用于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}}
};
Run Code Online (Sandbox Code Playgroud)
当如下重新修改时,错误更加明显。
std::array<std::pair<sf::IntRect, sf::IntRect>, 1> aliens{{
sf::IntRect{2,3,1,2},
sf::IntRect{4,1,3,2}
}};
Run Code Online (Sandbox Code Playgroud)
您正在尝试用单个sf::IntRect对象初始化一对。