C++ 为什么我的映射迭代器中有语法错误?

C++ 为什么我的映射迭代器中有语法错误?,c++,C++,我编写了一个模板函数,用于翻转我的std::map键和值 #include <map> #include <iterator> template <typename A, typename B> std::map<B, A> flip_map(std::map<A, B> &src) { std::map<B, A> dst; for (std::map<A, B>::iterator

我编写了一个模板函数,用于翻转我的
std::map
键和值

#include <map>
#include <iterator>

template <typename A, typename B>
std::map<B, A> flip_map(std::map<A, B> &src)
{
    std::map<B, A> dst;
    for (std::map<A, B>::iterator it = src.begin(); it != src.end(); ++it)
    {
        dst.insert(std::pair<B, A>(it->second, it->first));
    }
    return dst;
}
#包括
#包括
模板
标准::映射翻转图(标准::映射和src)
{
std::map-dst;
对于(std::map::iterator it=src.begin();it!=src.end();++it)
{
insert(std::pair(it->second,it->first));
}
返回dst;
}
VS给了我一个语法错误:

意外标记“标识符”,应为“;”

<>我不知道我做错了什么。< /p> :你需要<代码>类型名< /C> >,因为神秘的C++原因。< /P> 像这样:

for (typename std::map<A, B>::iterator it = src.begin(); it != src.end(); ++it)
//   ^^^^^^^^
for(typename std::map)


我会这样写:

#include <map>

template <typename A, typename B>
std::map<B, A> flip_map(const std::map<A, B>& src)
{
    std::map<B, A> dst;

    for (const auto& p : src)
        dst.insert(std::make_pair(p.second, p.first));

    return dst;
}
#包括
模板
标准::映射翻转映射(常量标准::映射和src)
{
std::map-dst;
用于(常数自动&p:src)
dst.insert(标准::制作U对(第二页,第一页));
返回dst;
}
事实上,碰巧我做到了;两周前。:)


(您也可以考虑一些<代码> .ESPOTE 和 STD::移动< /COD>等,这取决于什么是<代码> A<代码>和>代码> B/C>可能,但是由于您不能从地图键移动,这将永远是“有用的”。“<代码> STD::MAP::迭代器< /代码>是一个从属名。(粗略地说,它位于模板函数中,并且取决于该模板的参数

a
B
),因此需要在它前面加上
typename
关键字

template <typename A, typename B>
std::map<B, A> flip_map(std::map<A, B> &src)
{
    std::map<B, A> dst;
    for (typename std::map<A, B>::iterator it = src.begin(); it != src.end(); ++it)
    {
        dst.insert(std::pair<B, A>(it->second, it->first));
    }
    return dst;
}
或者(C++11及更高版本),让编译器通过使用
auto
std::make_pair
为您进行类型推断。这避免了程序员担心依赖名称的需要

template <typename A, typename B>
std::map<B, A> flip_map(const std::map<A, B> &src)
{
    std::map<B, A> dst;
    for (const auto &e : src)
    {
        dst.insert(std::make_pair(e.second, e.first));
    }
    return dst;
}
模板
标准::映射翻转映射(常量标准::映射和src)
{
std::map-dst;
用于(常数自动和e:src)
{
dst.insert(标准::生成配对(e.second,e.first));
}
返回dst;
}

记住,
auto
是你的朋友。让它为你做这项工作。
for(std::map::iterator it=src.begin();it!=src.end();++it)
->
for(auto-it=src.begin();it!=src.end();++it)
或者更好的是
for(auto e:dst)
@NathanOliver,或者更好的是
for(auto e:src)
最好的答案是:for(auto&[key,value]:src){…}谢谢,这是一个完整的答案。
template <typename A, typename B>
std::map<B, A> flip_map(const std::map<A, B> &src)
{
    std::map<B, A> dst;
    for (const auto &e : src)
    {
        dst.insert(std::make_pair(e.second, e.first));
    }
    return dst;
}