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

时间:2019-03-16 07:05:54

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

我正在尝试教自己一些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

3 个答案:

答案 0 :(得分: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模式。

答案 1 :(得分:0)

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

进行检查
<InvokeNextExceptionFilterAsync>

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

 getPages() {
      this.pagesService.getPages(this.projectId).subscribe((data: any  ) => {
        this.pages = data.result ;
        let _pages = this.pages.map(page => new PageModel(page.id, page.name,
          page.url, page.elements) );
        this.pages = _pages;
        console.log('pages');
        console.log( this.pages);
      });

g++ -v

答案 2 :(得分:0)

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

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