【问题标题】:std::byte is not member of 'std'std::byte 不是“std”的成员
【发布时间】:2019-07-01 22:57:57
【问题描述】:

我正在尝试学习 c++17 的新功能/噱头,但后来我到了 std::byte 并且由于某种未知原因,我似乎无法编译最基本的“hello world”用类型键入程序。

整个程序:

#include <cstddef>
int main(int argc, char* argv[])
{
    std::byte byte;
    return 0;
}

编译命令:

g++ ./main.cpp

但输出总是:

./main.cpp: In function ‘int main(int, char**)’:
./main.cpp:4:10: error: ‘byte’ is not a member of ‘std’
    std::byte byte;

我使用 gcc 7.4.0 在 Ubuntu 18.04 上工作。我已经检查了“/usr/include/c++/7.4.0/”并且头文件 cstddef 在那里并且似乎定义了字节。

我也试过用clang:

clang++ ./main.cpp

但结果是一样的。在这一点上,我只能认为 cstddef 已损坏/错误。有什么解决办法吗?

【问题讨论】:

  • 我认为需要c++17
  • 我做的一个尝试是使用 cmake(实际上是第一个)和 set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS ON)
  • @DFDark 你试过g++ -std=c++17 ./main.cpp了吗?
  • 现在我做到了,它的工作似乎我忽略了一些阅读。之前评论中的 CMake 也缺少 target_compile_features(${PROJECT_NAME} PRIVATE cxx_std_17)。如果你把它写出来作为答案,我会标记它是正确的。

标签: c++ gcc std ubuntu-18.04


【解决方案1】:

正如πάντα ῥεῖ 在评论中指出的那样,我缺少 c++17 编译标志。正确的编译命令:

g++ -std=c++17 ./main.cpp

【讨论】:

    【解决方案2】:

    如果您使用 clang 5.0(即使带有 -std=c++17 标志)也会发生相同的错误。 在这种情况下,要解决这个问题,您需要升级到 clang 6。

    一个临时和快速的解决方法是可能的(但不推荐,因为它使用std 命名空间),它可能是这样的:

    #if defined(__clang__) && __cplusplus >= 201703L && __clang_major__ < 6
    // This is a minimal workaround for clang 5.0 with missing std::byte type
    namespace std {
    enum class byte : unsigned char {};
    }
    #endif
    

    【讨论】:

    • 对于个人项目来说,这是一个合理的解决方法,但它仍然应该带有警告:“向命名空间 std 或嵌套在 std 中的任何命名空间添加声明或定义是未定义的行为, 除了少数例外...".
    • 好话。我非常清楚这只是一种解决方法,而不是 good 解决方案。在那种情况下,它是为了说明有时即使使用正确的 C++17 标志,也会发生同样的问题。我将改写我的答案以消除这种歧义。
    猜你喜欢
    • 2010-11-29
    • 1970-01-01
    • 2013-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多