C ++构造函数与相同键/值类型的std :: map模棱两可

阿契克

这里以一个类定义为例。

#include <string>
#include <map>

template <class T>
class Collection
{
private:
  std::map<std::string, T> data;

public:
  Collection() {}

  Collection(std::map<std::string, T> d)
  {
    data = d;
  }
};

使用ints,chars甚至vector模板类型初始化Collections时,此方法都可以正常工作但是,当使用a初始化一个string并调用第二个重载的构造函数时,例如:

Collection<std::string> col({
  { "key", "value" }
});

它不会编译,并引发以下退出错误:

main.cpp:24:22: error: call to constructor of 'Collection<std::__cxx11::string>'
      (aka 'Collection<basic_string<char> >') is ambiguous
  Collection<string> col({
                     ^   ~
main.cpp:8:7: note: candidate constructor (the implicit move constructor)
class Collection
      ^
main.cpp:8:7: note: candidate constructor (the implicit copy constructor)
main.cpp:16:3: note: candidate constructor
  Collection(map<string, T> d)
  ^

奇怪的是,虽然这种表示法可以与其他类型配合使用,并且可以中断,但这种表示法适用于string

Collection<std::string> col(std::map<std::string, std::string>({
  { "key", "value" }
}));

这里发生了什么?

TC

这是一个有趣的。

map可以从两个迭代器构造A

template<class InputIterator>
  map(InputIterator first, InputIterator last,
      const Compare& comp = Compare(), const Allocator& = Allocator());

值得注意的是,根本不需要此构造函数检查是否InputIterator是迭代器,更不用说将其取消引用的结果可转换为map的value类型了。当然,实际上尝试构造映射将失败,但是可以map通过相同类型的任何两个参数来构造重载解析

所以用

Collection<std::string> col({
  { "key", "value" }
});

编译器有两种解释:

  • 外部花括号map使用map的initializer-list构造函数初始化a,内部花括号pair为该initializer-list构造函数初始化a
  • 外花括号初始化a Collection,内花括号map使用“ iterator-pair”构造函数初始化a

两者都是排名中用户定义的转换,两者之间没有决胜局,因此调用是不明确的-即使第二个调用(如果选择)也会在map构造函数内部导致错误

在最外层也使用花括号时:

Collection<std::string> col{{
  { "key", "value" }
}};

该标准一条特殊的规则排除了第二种解释。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C ++构造函数与相同键/值类型的std :: map模棱两可

来自分类Dev

我正在尝试在C ++ 03中嵌套boost的“ map_list_of”,但显然构造是模棱两可的吗?

来自分类Dev

C ++构造函数“模棱两可”-但实际上并非如此

来自分类Dev

(C++) 构造函数,默认参数,“调用重载...模棱两可”

来自分类Dev

C ++ 11/14 make_unique std :: string的模棱两可的重载

来自分类Dev

C ++中的重载函数为unsigned char和unsigned int导致模棱两可

来自分类Dev

C ++中的重载函数为unsigned char和unsigned int导致模棱两可

来自分类Dev

错误C2668:'boost :: bind':对重载函数的模棱两可的调用

来自分类Dev

具有依赖类型的c ++ 11可变函数模板重载是否模棱两可?

来自分类Dev

为什么传递值和传递右值重载c ++函数调用是模棱两可的?

来自分类Dev

MSVC-C2668对重载函数的模棱两可的调用-它是编译器错误吗?

来自分类Dev

C ++编译错误:无法从B转换为A,没有构造函数,或者构造函数重载模棱两可

来自分类Dev

C ++模板,模棱两可的重载

来自分类Dev

C ++ 11 Lambda模棱两可

来自分类Dev

C ++ libconfig模棱两可的重载

来自分类Dev

C ++ typedef继承模棱两可的问题

来自分类Dev

C ++ Cout,Cin和系统“模棱两可”

来自分类Dev

C ++临时类实例模棱两可

来自分类Dev

C ++模板模棱两可的实例化

来自分类Dev

C ++ const mysqlpp :: String模棱两可的错误

来自分类Dev

C ++继承错误:模棱两可的错误

来自分类Dev

C ++ libconfig模棱两可的重载

来自分类Dev

在C#中返回模棱两可的对象

来自分类Dev

增强变体模棱两可的构造

来自分类Dev

'std :: cin >>'中'operator >>'的模棱两可的重载

来自分类Dev

用幻像类型强制模棱两可的实例

来自分类Dev

该方法对于错误类型是模棱两可的

来自分类Dev

用幻像类型强制模棱两可的实例

来自分类Dev

错误:对重载函数的模棱两可的调用

Related 相关文章

  1. 1

    C ++构造函数与相同键/值类型的std :: map模棱两可

  2. 2

    我正在尝试在C ++ 03中嵌套boost的“ map_list_of”,但显然构造是模棱两可的吗?

  3. 3

    C ++构造函数“模棱两可”-但实际上并非如此

  4. 4

    (C++) 构造函数,默认参数,“调用重载...模棱两可”

  5. 5

    C ++ 11/14 make_unique std :: string的模棱两可的重载

  6. 6

    C ++中的重载函数为unsigned char和unsigned int导致模棱两可

  7. 7

    C ++中的重载函数为unsigned char和unsigned int导致模棱两可

  8. 8

    错误C2668:'boost :: bind':对重载函数的模棱两可的调用

  9. 9

    具有依赖类型的c ++ 11可变函数模板重载是否模棱两可?

  10. 10

    为什么传递值和传递右值重载c ++函数调用是模棱两可的?

  11. 11

    MSVC-C2668对重载函数的模棱两可的调用-它是编译器错误吗?

  12. 12

    C ++编译错误:无法从B转换为A,没有构造函数,或者构造函数重载模棱两可

  13. 13

    C ++模板,模棱两可的重载

  14. 14

    C ++ 11 Lambda模棱两可

  15. 15

    C ++ libconfig模棱两可的重载

  16. 16

    C ++ typedef继承模棱两可的问题

  17. 17

    C ++ Cout,Cin和系统“模棱两可”

  18. 18

    C ++临时类实例模棱两可

  19. 19

    C ++模板模棱两可的实例化

  20. 20

    C ++ const mysqlpp :: String模棱两可的错误

  21. 21

    C ++继承错误:模棱两可的错误

  22. 22

    C ++ libconfig模棱两可的重载

  23. 23

    在C#中返回模棱两可的对象

  24. 24

    增强变体模棱两可的构造

  25. 25

    'std :: cin >>'中'operator >>'的模棱两可的重载

  26. 26

    用幻像类型强制模棱两可的实例

  27. 27

    该方法对于错误类型是模棱两可的

  28. 28

    用幻像类型强制模棱两可的实例

  29. 29

    错误:对重载函数的模棱两可的调用

热门标签

归档