序言:
我知道有一些主题具有相同或相似的标题。继续阅读,你会理解我的情况。
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;
^
这本书假设它的示例练习起作用,但它并没有 我发现了一些关于这个或类似错误的其他主题,但它们似乎都不适合我。
我也查阅了勘误表,但没有为本书的那一部分注册错误。
有人能告诉我这里有什么问题吗?然后我会向作者报告该错误。
答案 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-8
和g++-8
软件包,结构化绑定现在可以正常工作。