我已经尝试了Expert C++ Programming中的以下代码段。 g ++正在给出编译错误。这仅仅是g ++无法赶上C ++ 17语法的一种情况吗?
lib_test.cpp:39:15: error: expected unqualified-id before ‘[’ token
auto [iter, success] = m.try_emplace(b.country, b, 1);
^
我使用-std=c++17
标志。
g ++(Ubuntu 6.4.0-17ubuntu1)6.4.0 20180424
#include <iostream>
#include <functional>
#include <list>
#include <map>
using namespace std;
struct billionaire {
string name;
double dollars;
string country;
};
void efficient_map_test()
{
list<billionaire> billionares {
{"Bill Gates", 86.0, "USA"},
{"Warren Buffet", 75.6, "USA"},
{"Jeff Bezos", 72.8, "USA"},
{"Amnancio Ortega", 71.3, "Spain"},
{"Mark Zuckerberg", 56.0, "USA"},
{"Carlos Slim", 54.5, "Mexico"},
{"Bernard Arnualt", 41.5, "France"},
{"Liliane Bettencourt", 39.5, "France"},
{"Wang Jianlin", 31.3, "China"},
{"Li Ka-shing", 31.2, "Hong Kong"}
};
map<string, pair<const billionaire, size_t>> m;
for (const auto &b: billionares) {
auto [iter, success] = m.try_emplace(b.country, b, 1);
if (!success) {
iter->second.second += 1;
}
}
for (const auto &[key, value]: m) {
const auto &[b, count ] = value;
cout << b.country << " : " << count
<< "billionaires. Richest is "
<< b.name << " with " << b.dollars
<< " B$n";
}
}
int main()
{
return 0;
}
编辑:1. -std = C ++ 17-> -std = c ++ 17
2.添加了空的main,使其可以复制/粘贴就绪
答案 0 :(得分:2)
您只是使编译标志错误。这是小写的c:
g++ -std=c++17 -o main main.cpp
不是像您在问题(-std=C++17
)中写的那样大写C。
哦,请添加一个空的main函数,以便您的代码可以复制粘贴。
答案 1 :(得分:0)
这是由于缺乏 gcc 支持(版本 6.3、6.4、...)。
尽管您可以在这些版本中使用 c++17,但缺少此特定功能。
这个小例子可以在 Debian Buster g++ (Debian 8.3.0-6) 8.3.0
上编译没有错误,但是在 Debian Strech g++ (Debian 6.3.0-18+deb9u1) 6.3.0
上编译失败。
#include <tuple>
int main() {
auto a = std::make_tuple(0, true);
auto [b, c] = a;
return 0;
}
# g++ -std=c++17 -o main main.cc
main.cc: In function 'int main()':
main.cc:5:8: error: expected unqualified-id before '[' token
auto [b, c] = a;
^