为什么std :: size()不是gcc 8.2.0中std的成员

问题描述 投票:1回答:2

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

为什么编译器会为下面的代码片段抛出错误?

#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
c++ gcc g++ standard-library
2个回答
3
投票

有关GCC中的C ++ 17支持,请参阅:

目前,默认情况下不启用C ++ 17支持:

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

目前,GCC的C ++ 17 ABI尚未最终确定。这意味着今天在C ++ 17模式下构建的程序可能无法链接到也以C ++ 17模式编译的过去或未来二进制文件(或在运行时崩溃)。稳定的ABI可确保跨编译器版本的这种互操作性。

一旦ABI成为最终版,GCC的未来版本将默认启用C ++ 17模式。


0
投票

您的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
© www.soinside.com 2019 - 2024. All rights reserved.