std::byte不是'std'的成员

3

我正在尝试学习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;

我在Ubuntu 18.04上使用gcc 7.4.0进行工作。我已经检查了"/usr/include/c++/7.4.0/",头文件cstddef在那里,并且byte似乎被定义了。
我还尝试使用clang:
clang++ ./main.cpp

但结果是一样的。在这一点上,我只能认为cstddef被损坏/有bug了。有没有什么解决办法?

6
我认为需要使用C++17。 - drescherjm
它确实可以:https://en.cppreference.com/w/cpp/types/byte - πάντα ῥεῖ
我尝试过的一种方法是使用cmake(实际上是第一种方法),并设置set(CMAKE_CXX_STANDARD 17)、set(CMAKE_CXX_STANDARD_REQUIRED ON)和set(CMAKE_CXX_EXTENSIONS ON)。 - DFDark
2
@DFDark 你已经尝试过 g++ -std=c++17 ./main.cpp 了吗? - πάντα ῥεῖ
现在我已经做好了,它正在运作,似乎我忽略了一些阅读。此外,在之前的评论中,CMake 缺少了 target_compile_features(${PROJECT_NAME} PRIVATE cxx_std_17)。如果您将其写成答案,我会将其标记为正确。 - DFDark
@DFDark 如果你愿意,可以自己写一个答案,我现在有点懒。 - πάντα ῥεῖ
2个回答

10

πάντα ῥεῖ在评论中指出,我漏了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中的命名空间添加声明或定义是未定义行为,有几个例外...”。 - Ted Lyngmo
1
好的评论。我完全意识到这只是一个权宜之计,而不是一个好的解决方案。在这种情况下,它是为了说明有时即使使用适当的C++17标志,同样的问题也可能发生。我将重新措辞我的答案以消除这种歧义。 - Pascal H.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接