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

时间:2018-08-29 19:59:52

标签: c++ stl iterator language-lawyer overloading

编译以下代码

italian

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

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

,我从msvc和clang得到类似的错误。我想问题是它们代表相同的基础类型 因为在std :: set中,成员是const。这似乎可以通过以下事实得到证实:将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); 替换为set导致 可以很好地编译。

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

vector

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

所以我的问题:

  • 为什么不允许这种超载?
  • 为什么将它们放在全局名称空间中允许它们进行编译?

1 个答案:

答案 0 :(得分:3)

在全局范围内,它们只是同一函数的声明(当两个迭代器均为同一类型时)。

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(一个定义规则)(并且链接器可能出现重复的符号错误)。