【问题标题】:Why std::size() is not a member of std in gcc 8.2.0为什么 std::size() 在 gcc 8.2.0 中不是 std 的成员
【发布时间】:2019-08-07 05:23:04
【问题描述】:

我正在尝试自学一些 C++17。

为什么编译器会为下面的代码 sn-p 抛出错误?

#include <iostream> 
#include <vector>
#include <iterator>

int main() 
{
    std::vector<int> v = { 3, 1, 4 };
    std::cout << std::size(v) << '\n'; 

    int a[] = { -5, 10, 15 };
    std::cout << std::size(a) << '\n';
}

编译器抛出以下错误

manish@Manish-Tummala:~/c_files$ g++ 6.cpp -o - 6.out
6.cpp: In function ‘int main()’:
6.cpp:8:23: error: ‘size’ is not a member of ‘std’
     std::cout << std::size(v) << '\n';
                       ^~~~
6.cpp:8:23: note: suggested alternative: ‘size_t’
     std::cout << std::size(v) << '\n';
                       ^~~~
                       size_t
6.cpp:11:23: error: ‘size’ is not a member of ‘std’
     std::cout << std::size(a) << '\n';
                       ^~~~
6.cpp:11:23: note: suggested alternative: ‘size_t’
     std::cout << std::size(a) << '\n';
                       ^~~~
                       size_t

【问题讨论】:

  • 您需要 -std=c++17 标志来告诉编译器使用 C++17。否则,你可以做a.size()
  • @Mirko a.size() 不起作用,因为 a 是一个原始的 int[] 数组。 std::array&lt;int, 3&gt; 必须被使用
  • @RemyLebeau 真实数据。他仍然可以做到v.size() 和sizeof(a)/sizeof(a[0])

标签: c++ gcc g++ standard-library


【解决方案1】:

GCC对C++17的支持,请参考:

从 GCC 11.1 开始默认 C++17 编译模式。在早期的 GCC 版本中,可以使用命令行参数启用:

要启用 C++17 支持,请将命令行参数 -std=c++17 添加到您的 g++ 命令行。或者,要启用除 C++17 功能之外的 GNU 扩展,请添加 -std=gnu++17。

请注意,对于 GCC 9.1 之前的 GCC 版本,C++ 库 ABI 仍被认为是不稳定的,因此如果您使用较早的编译器构建和链接您的应用程序,它可能无法在不同的 libstdc++ 运行时库版本(来自不同的 GCC 版本,例如由操作系统升级引入)。

【讨论】:

    【解决方案2】:

    您的 g++ 安装版本需要为 6 或更高版本。您可以使用

    进行检查
    g++ -v
    

    如果您的 g++ 版本足够高。您还必须使用 c++17 命令行选项执行它。

    g++ -std=c++17 6.cpp -o 6.out
    

    或

    g++ -std=gnu++17 6.cpp -o 6.out
    

    【讨论】:

      【解决方案3】:

      对于 VSCode:添加对 C++17 的显式引用会有所帮助,这可以通过修改文件夹中的 tasks.json 文件来完成

        "args": [
                 "-std=c++17",
                 "${file}",
                  "-o",
                  "${fileDirname}\\${fileBasenameNoExtension}.exe"
              ]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-07-04
        • 2016-08-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多