我正在尝试编译一个使用
std::ranges::sort()
和 clang++16 的程序。根据网站 https://en.cppreference.com/w/cpp/compiler_support/20,One Ranges 提案已在 Clangs 的 libc++ 版本 13(部分)、15(需要 -fexperimental-library
标志)中实现,并且16(不带旗帜)。
我使用
sudo pkg install llvm16
安装了 clang++16,但是在尝试编译应用程序时,出现错误“没有调用‘排序’的匹配函数”。
最小可重现示例:
#include <algorithm>
#include <ranges>
#include <array>
int main()
{
std::array s {5, 7, 4, 2, 8, 6, 1, 9, 0, 3};
std::ranges::sort(s);
}
尝试使用
clang++16 -std=c++20 -stdlib=libc++ test.cpp -o test
进行编译会导致此错误:
test.cpp:9:15: error: no type named 'sort' in namespace 'std::ranges'
std::ranges::sort(s);
~~~~~~~~~~~~~^
1 error generated.
我做错了什么?
FreeBSD 13.2 镜像中提供的
libc++
版本太旧。使用 -fexperimental-library
标志没有帮助。
我能够使用 FreeBSD 14.0 映像成功编译带有
-fexperimental-library
标志的示例代码。
如果需要支持 FreeBSD 13.2,并且也可以选择使用 Boost,您可以尝试
#include <boost/range/algorithm.hpp>
并使用 boost::range::sort()
代替 std::ranges::sort()
:
#include <array>
#include <boost/range/algorithm.hpp>
int main()
{
std::array s {5, 7, 4, 2, 8, 6, 1, 9, 0, 3};
boost::range::sort(s);
// ...
}