对于set iterator和const_iterator的输入,不能重载成员函数(但可以用于其他stl迭代器)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对于set iterator和const_iterator的输入,不能重载成员函数(但可以用于其他stl迭代器)相关的知识,希望对你有一定的参考价值。

编译以下代码

struct foo {
    int foo(std::set<int>::iterator);
    int foo(std::set<int>::const_iterator);
};

我从gcc(mingw)收到以下错误

func.cpp:5:9: error: 'int functor::foo(std::set<int>::const_iterator)' cannot be overloaded
    int foo(std::set<int>::const_iterator);

func.cpp:4:9: error: with 'int functor::foo(std::set<int>::iterator)'
    int foo(std::set<int>::iterator);

我从msvc和clang得到了类似的错误。我猜测问题是它们代表相同的底层类型,因为在std :: set中,成员是const。这似乎可以通过用set替换vector导致它完美无缺的事实得到证实。

奇怪的是,当我从结构中删除函数并将它们放在全局命名空间中时

int foo(std::set<int>::iterator);
int foo(std::set<int>::const_iterator);

它编译没有错误。这可能是由于我不知道的非成员函数的不同重载规则,我不确定

所以我的问题:

  • 为什么这个超载不允许?
  • 为什么将它们放在全局命名空间中允许它们编译?
答案

在全局范围内,这些只是声明相同的函数(当两个迭代器都是相同类型时)。

int foo(std::set<int>::iterator);
int foo(std::set<int>::const_iterator);

在课堂上,你不能声明两次相同的方法。

如果定义函数:

int foo(std::set<int>::iterator) {return 0;}
int foo(std::set<int>::const_iterator) {return 0;} // program is ill formed (when iterator are same type)

您使用相同功能的2个定义来破坏ODR(一个定义规则)(并且可能与链接器有重复的符号错误)。

以上是关于对于set iterator和const_iterator的输入,不能重载成员函数(但可以用于其他stl迭代器)的主要内容,如果未能解决你的问题,请参考以下文章

总结java集合

set的iterator()方法怎么用?

Angular:找不到 Promise、Map、Set 和 Iterator

26.使用Iterator和增强型for循环遍历Set

数据结构

数据结构