首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么我的map迭代器中有语法错误?

为什么我的map迭代器中有语法错误?
EN

Stack Overflow用户
提问于 2019-03-25 07:14:03
回答 2查看 204关注 0票数 -1

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

代码语言:javascript
运行
复制
#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;
}

VS给了我一个语法错误:

标识符意外的标记‘

’,应为';‘

我不知道我做错了什么。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-25 07:17:54

GCC tells you more clearly what's wrong:出于神秘的C++原因,您需要在那里使用typename

如下所示:

代码语言:javascript
运行
复制
for (typename std::map<A, B>::iterator it = src.begin(); it != src.end(); ++it)
//   ^^^^^^^^

进一步阅读:

相反,我会这样写:

代码语言:javascript
运行
复制
#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;
}

事实上,碰巧的是,我在两周前就做到了。:)

(您还可以考虑一些.emplacestd::move等,这取决于AB可能是什么,尽管由于您不能从映射键移动,这只会是“某种有用的”。)

票数 5
EN

Stack Overflow用户

发布于 2019-03-25 08:02:23

原因是std::map<A,B>::iterator是一个依赖名称(粗略地说,它在一个模板化的函数中,并且依赖于该模板的参数AB )。因此,它前面需要有typename关键字。

代码语言:javascript
运行
复制
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;
}

此外,最好将src指定为const,并使用const_iterator而不是iterator,即

代码语言:javascript
运行
复制
template <typename A, typename B>
std::map<B, A> flip_map(const std::map<A, B> &src)
{
    std::map<B, A> dst;
    for (typename std::map<A, B>::const_iterator it = src.begin(); it != src.end(); ++it)
    {
        dst.insert(std::pair<B, A>(it->second, it->first));
    }
    return dst;
}

或者(C++11和更高版本),让编译器使用autostd::make_pair为您进行类型推导。这就避免了程序员担心依赖名的问题。

代码语言:javascript
运行
复制
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;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55329483

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档