C ++错误:在' ['之前的预期不合格ID使用结构化绑定时的标记

时间:2018-02-14 23:37:03

标签: c++ c++17 structured-bindings

序言:
我知道有一些主题具有相同或相似的标题。继续阅读,你会理解我的情况。

C ++新手我目前正在读一本非常明显有腐败案例练习的书。
我的代码

#include <iostream>

using namespace std;

struct Point {
    int x;
    int y;
};

int main(int argc, char const* argv[]) {

    Point p1{100, 200};

    auto [a, b] = p1;

    cout << "a = " << a << endl;
    cout << "b = " << b << endl;

    auto& [c, d] = p1;

    c += 50;
    d += 50;

    cout << "p1.x = " << p1.x << endl;
    cout << "p1.y = " << p1.y << endl;

    return 0;
}

几乎是这本书的精确副本。我只将原来的一行cout分成两行,并使用了命名空间std而不是std ::。除此之外,代码与书中的示例完全相同。

为了100%确定我不只是输入错误,我从书籍网站上下载了示例文件。
我们都得到了同样的错误:

structuredBinding.cpp: In function ‘int main(int, const char**)’:
structuredBinding.cpp:14:7: error: expected unqualified-id before ‘[’ token
  auto [a, b] = p1;
       ^
structuredBinding.cpp:16:20: error: ‘a’ was not declared in this scope
  cout << "a = " << a << endl;
                    ^
structuredBinding.cpp:17:20: error: ‘b’ was not declared in this scope
  cout << "b = " << b << endl;
                    ^
structuredBinding.cpp:19:8: error: expected unqualified-id before ‘[’ token
  auto& [c, d] = p1;
        ^
structuredBinding.cpp:19:8: error: expected initializer before ‘[’ token
structuredBinding.cpp:21:2: error: ‘c’ was not declared in this scope
  c += 50;
  ^
structuredBinding.cpp:22:2: error: ‘d’ was not declared in this scope
  d += 50;
  ^

这本书假设它的示例练习起作用,但它并没有 我发现了一些关于这个或类似错误的其他主题,但它们似乎都不适合我。

我也查阅了勘误表,但没有为本书的那一部分注册错误。

有人能告诉我这里有什么问题吗?然后我会向作者报告该错误。

1 个答案:

答案 0 :(得分:0)

要利用GCC中的C ++ 17功能,您需要在编译器命令行上传递-std=c++17(例如,通过在Makefile中设置CXXFLAGS)。

但是,并非所有版本的GCC都支持所有C ++ 17标准。

根据C++ Standards Support in GCC,您至少需要 g ++ 7 来利用结构化绑定,而至少需要 g ++ 8 来利用与可访问成员的结构化绑定的优势(例如,来自朋友功能的私人成员,而不是公共成员)。

Ubuntu 16.04具有g ++ 5.4,Ubuntu 18.04具有g ++ 7.3。要在Ubuntu上安装g ++的较新版本,请参阅Ask Ubuntu上的Install gcc-8 only on Ubuntu 18.04?(同样适用于Ubuntu 16.04),尤其是this answer

我刚刚在Ubuntu 16.04系统上安装了gcc-8g++-8软件包,结构化绑定现在可以正常工作。