在 Linux 中使用 g++ 编译器编译 fmtlib include 文件时,得到类错误是私有的,无法从外部访问

When compiling fmtlib include file in Linux with g++ compiler getting an error of class is private and cannot be accessed from outside

提问人:prakash 提问时间:11/6/2023 更新时间:11/7/2023 访问量:74

问:

我正在使用 #include < fmt/ranges.h> 在我的 C++ 应用程序中格式化 std::array

#include <fmt/ranges.h>

#include <array>

int main()
{
    std::array<short unsigned int, 3> arr = {1, 2, 3};
    fmt::print("{}", arr);
}

它在 Windows 和 macos 中正确编译,但在使用 g++ 编译器的 linux 中失败,并出现以下错误:

../externals/fmtlib/fmt/ranges.h:49:29:错误:类“fmt::v10::d etail::is_std_string_like”中的所有成员函数都是私有的 [-Werror=ctor-dtor-privacy] 模板类 is_std_string_like {

../externals/fmtlib/fmt/ranges.h:65:29:错误:类“fmt::v10::d etail::is_map”中的所有成员函数都是私有的 [-Werror=ctor-dtor-privacy]

模板类 is_map {

../externals/fmtlib/fmt/ranges.h:49:29:错误:类“fmt::v10::d etail::is_std_string_like”中的所有成员函数都是私有的 [-Werror=ctor-dtor-privacy] 模板类 is_std_string_like {

../externals/fmtlib/fmt/ranges.h:65:29:错误:类“fmt::v10::d etail::is_map”中的所有成员函数都是私有的 [-Werror=ctor-dtor-privacy]

模板类 is_map {

截至撰写本文时,MSVC 和 Clang 是仅有的 2 个支持标头的编译器。g++ 不支持吗

似乎 MSVC 和 Clang 是唯一支持此标头的 2 个编译器 <fmt/ranges.h>。而 g++ 不支持此标头。

请帮帮我。

C 格式化 C++17 G++

评论

0赞 BoP 11/6/2023
G++ 是正确的,所有成员函数都是私有的。不过还有其他公众成员。如果您不希望此类类出现警告,则必须将其关闭。
0赞 prakash 11/6/2023
谢谢@BoP。你的意思是说唯一的选择就是关闭这些警告。是否有任何其他选项可以在不关闭警告的情况下使用这些标头?
0赞 BoP 11/6/2023
我没有将 fmt 与 g++ 一起使用,所以不知道还会发生什么。但一般来说,编译器会警告一些奇怪的事情,这可能是一个问题,比如一个类中没有可调用的函数。在这种情况下,这不是一个错误,而是一个不寻常的设计选择。因此,您必须告诉编译器在这种情况下是可以的。
0赞 n. m. could be an AI 11/6/2023
无法重现,程序编译时不会出现任何警告或错误。
0赞 prakash 11/6/2023
@n.m.couldbeanAI,谢谢。我使用的是 gcc 版本 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.1)。使用此 gcc 版本,在编译时,我遇到了上述错误。

答:

1赞 vitaut 11/7/2023 #1

问题是您选择拒绝有效的 C++ 代码,解决方案是从您的构建标志中删除此标志,至少在编译时是这样。-Werror=ctor-dtor-privacyfmt/ranges.h

评论

0赞 n. m. could be an AI 11/8/2023
拒绝有效的 C++ 代码这就是警告的目的---对技术上有效但可疑的代码大喊大叫。但是,在存储库中找到的 fmt/ranges.h 中的代码并不可疑。里面有公共成员函数,问题不能被其他人重现。因此,关闭警告就等于扫地。