std::get 有许多重载,此外,每个重载本身都是一个函数模板,因此编译器无法在您请求其中一个地址的调用站点上判断您想要哪个。如果您坚持使用std::get,则需要使用static_cast:
transform(mss.begin(), mss.end(), back_inserter(vs),
static_cast<const map<string, string>::key_type&
(*)(map<string, string>::value_type&)>(std::get<0>)
);
只要static_cast 中的类型与作为参数给出的可能函数模板的特化声明相匹配,这将起作用。此外,您不应该尝试显式指定函数模板的模板参数,如get<0, string, string> 等 - 这就是模板参数推导机制的用途。不仅语法丑陋,而且将来可能会添加其他重载来破坏您的编译。
更好的选择是使用 lambda 表达式:
transform(mss.begin(), mss.end(), back_inserter(vs),
[](map<string, string>::value_type& p){ return p.first; });
或通用 lambda 表达式 (C++14):
transform(mss.begin(), mss.end(), back_inserter(vs),
[](auto& p){ return p.first; }); // or `return std::get<0>(p);`
或std::mem_fn 将其参数绑定到指向数据成员或成员函数的给定指针:
#include <functional>
transform(mss.begin(), mss.end(), back_inserter(vs),
mem_fn(&map<string, string>::value_type::first));