【问题标题】:Confusing error from structured binding declaration结构化绑定声明的令人困惑的错误
【发布时间】:2021-04-23 15:37:15
【问题描述】:
#include <algorithm>
#include <tuple>
#include <vector>

using namespace std;
int main() {

  vector<vector<int>> points = {{3, 12}, {-2, 5}, {-4, 1}};
  vector<tuple<int, int, int>> edges;
  for (int u = 0; u < points.size(); ++u) {
    for (int v = u + 1; v < points.size(); ++v) {
      edges.emplace_back(u, v,
                         abs(points[v][0] - points[u][0]) +
                             abs(points[v][1] - points[u][1]));
    }
  }
  sort(begin(edges), end(edges),
       [](const auto &a, const auto &b) { return get<2>(a) < get<2>(b); });
  int result = 0;
  for (const auto &[u, v, val] : edges) {
    result += val;
  }

  return 0;
}

g++ -std=c++17 main.cc编译

得到以下困惑的错误:

main.cc:在函数“int main()”中:

main.cc:20:20: 错误:'[' token 之前的预期 unqualified-id

for (const auto &[u, v, val] : 边) { ^ main.cc:20:20: 错误:在“[”标记之前需要“;”

main.cc:20:21: 错误:'u' 未在此范围内声明

for (const auto &[u, v, val] : 边) { ^ main.cc:20:24: 错误:'v' 未在此范围内声明

for (const auto &[u, v, val] : 边) { ^ main.cc:20:27: 错误:'val' 未在此范围内声明

for (const auto &[u, v, val] : 边) { ^ main.cc:在 lambda 函数中:

main.cc:20:32: 错误:在“:”标记之前需要“{”

for (const auto &[u, v, val] : 边) { ^ main.cc: 在函数'int main()'中:

main.cc:20:32: 错误:在“:”标记之前需要“;”

main.cc:20:32: 错误:':' 标记之前的预期主表达式

main.cc:20:32: 错误:':' 标记之前的预期')'

main.cc:20:32: 错误:':' 标记之前的预期主表达式

如何解决这个错误? 注意:gcc 版本 5.4.0

【问题讨论】:

  • gcc 5.4.0 是否支持C++17
  • 在 GCC 7 中添加了结构化绑定支持。这是参考:gcc.gnu.org/projects/cxx-status.html#cxx17
  • 也许用for (const auto &amp;val : edges)替换for (const auto &amp;[u, v, val] : edges)
  • 添加行号会有所帮助。

标签: c++ algorithm vector tuples


【解决方案1】:

您的程序在 C++17 中格式正确,但您的 GCC 版本太旧,无法支持 C++17:s 结构化绑定。

C++ Standards Support in GCC 中所述,结构化绑定 (P0283R2) 是为 GCC 7 实现的,因此在现在古老的 GCC 5.4 中不(完全)可用。

我们可以通过指出您的程序为 GCC 7.1 (DEMO) 编译,而它不能为 GCC 6.3 (DEMO) 编译来验证这一点。

【讨论】:

    猜你喜欢
    • 2019-12-23
    • 1970-01-01
    • 2011-02-03
    • 1970-01-01
    • 1970-01-01
    • 2011-07-24
    • 2021-06-13
    • 1970-01-01
    • 2018-03-14
    相关资源
    最近更新 更多