为什么对重载函数的调用不明确?

帕万·曼朱纳斯

考虑这个程序-

#include <string>
#include <vector>
#include <set>
void fun(const std::string& val) {
}

void fun(std::vector<std::string> val) {
}

int main()
{
    std::set<std::string> example;
    fun({std::begin(example), std::end(example)});
}

在编译时,我遇到了这些错误-

prog.cc: In function 'int main()':
prog.cc:13:49: error: call of overloaded 'fun(<brace-enclosed initializer list>)' is ambiguous
   13 |     fun({std::begin(example), std::end(example)});
      |                                                 ^
prog.cc:4:6: note: candidate: 'void fun(const string&)'
    4 | void fun(const std::string& val) {
      |      ^~~
prog.cc:7:6: note: candidate: 'void fun(std::vector<std::__cxx11::basic_string<char> >)'
    7 | void fun(std::vector<std::string> val) {
      |      ^~~

据我了解,std::string它的构造函数重载会initializer_list像这样-

basic_string( std::initializer_list<char> ilist,
              const Allocator& alloc = Allocator() );

并且std::vector<std::string>有一个看起来像这样的过载

vector( std::initializer_list<std::string> init,
        const Allocator& alloc = Allocator() );

因此,很明显,这两种方法的类型不同。一个采用一个initializer_listof char,另一个采用type std::string

在我的代码中,当我传递字符串cos的初始化列表时,我将2个迭代器传递给一组字符串。

即使这样,编译器为何仍将此标记为歧义调用?

达尔胡克

编译器看到对以下两个构造函数的模棱两可的调用(请注意,它们都不使用初始化列表):

template <class InputIt>
std::vector::vector (InputIt first, InputIt last, const Allocator& alloc = Allocator());

template <class InputIt>
std::string::string (InputIt first, InputIt last, const Allocator& alloc = Allocator());

现在,如果您实际上要std::string使用那些迭代器参数调用构造函数,则会收到错误消息,因为它们没有取消引用char。但是由于该检查不是函数声明的一部分(例如,通过SFINAE),所以您将得到歧义错误。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

重载函数的调用不明确

来自分类Dev

使用float会导致“对重载函数的调用不明确”错误

来自分类Dev

为什么编译器在 C++11 中给出消息“重载函数的调用不明确”?

来自分类Dev

重载函数的调用不明确,double vs float

来自分类Dev

使用QApplication :: applicationDirPath调用时,重载的arg(QString(&)())的调用不明确,为什么?

来自分类Dev

为什么对swap()的调用不明确?

来自分类Dev

为什么这些方法调用不明确?

来自分类Dev

C ++为什么调用不明确?

来自分类Dev

为什么这些方法调用不明确?

来自分类Dev

调用函数不明确,但是为什么呢?

来自分类Dev

重载write(int)的调用不明确

来自分类Dev

为什么此运算符=调用不明确?

来自分类Dev

为什么此函数重载与参数类型转换不明确?

来自分类Dev

为什么此函数重载与参数类型转换不明确?

来自分类Dev

为什么postgres触发函数返回一些列引用不明确?

来自分类Dev

重载字符向量和字符串C ++时对成员函数的调用不明确

来自分类Dev

解决了不明确的重载方法调用

来自分类Dev

不明确的函数重载 [例如 max()]

来自分类Dev

为什么此调用对编译器不明确?

来自分类Dev

OpenCL:调用内置函数不明确

来自分类Dev

当无关类型定义为别名时,对函数的调用不明确

来自分类Dev

gcc与clang,msvc和icc:此函数调用不明确吗?

来自分类Dev

为什么此代码不明确?

来自分类Dev

时间不明确,为什么?

来自分类Dev

对“ Create”(而不是“ Foo”)的不明确的重载调用

来自分类Dev

无法在 SoapUI 中调用请求 - 不明确的方法重载

来自分类Dev

同一库之间的调用不明确?

来自分类Dev

以下方法之间的调用不明确

来自分类Dev

Firebase调用中下标的使用不明确

Related 相关文章

  1. 1

    重载函数的调用不明确

  2. 2

    使用float会导致“对重载函数的调用不明确”错误

  3. 3

    为什么编译器在 C++11 中给出消息“重载函数的调用不明确”?

  4. 4

    重载函数的调用不明确,double vs float

  5. 5

    使用QApplication :: applicationDirPath调用时,重载的arg(QString(&)())的调用不明确,为什么?

  6. 6

    为什么对swap()的调用不明确?

  7. 7

    为什么这些方法调用不明确?

  8. 8

    C ++为什么调用不明确?

  9. 9

    为什么这些方法调用不明确?

  10. 10

    调用函数不明确,但是为什么呢?

  11. 11

    重载write(int)的调用不明确

  12. 12

    为什么此运算符=调用不明确?

  13. 13

    为什么此函数重载与参数类型转换不明确?

  14. 14

    为什么此函数重载与参数类型转换不明确?

  15. 15

    为什么postgres触发函数返回一些列引用不明确?

  16. 16

    重载字符向量和字符串C ++时对成员函数的调用不明确

  17. 17

    解决了不明确的重载方法调用

  18. 18

    不明确的函数重载 [例如 max()]

  19. 19

    为什么此调用对编译器不明确?

  20. 20

    OpenCL:调用内置函数不明确

  21. 21

    当无关类型定义为别名时,对函数的调用不明确

  22. 22

    gcc与clang,msvc和icc:此函数调用不明确吗?

  23. 23

    为什么此代码不明确?

  24. 24

    时间不明确,为什么?

  25. 25

    对“ Create”(而不是“ Foo”)的不明确的重载调用

  26. 26

    无法在 SoapUI 中调用请求 - 不明确的方法重载

  27. 27

    同一库之间的调用不明确?

  28. 28

    以下方法之间的调用不明确

  29. 29

    Firebase调用中下标的使用不明确

热门标签

归档