使用转换运算符初始化地图

时间:2016-11-01 12:42:37

标签: c++ implicit-conversion initializer-list

什么阻止此初始化工作?

ImageIO.write(im2,"PNG", new File("Demo_copy.png"));

看起来#include <map> using std::map; using std::pair; using std::make_pair; struct P { char a_, b_; P(char a, char b) : a_{a}, b_{b} {} operator pair<char,char>() { return make_pair(a_, b_); } }; int main() { map<char,char> qmap { P( 'a','b' ) }; } 中的转换运算符无法隐式应用于braced-initialisier-list中?还是别的什么?

2 个答案:

答案 0 :(得分:4)

请注意std::map的关键部分是const,因此std::map<char, char>的元素类型为std::pair<const char, char>;这里的类型不匹配。带有大括号的返回std::pair<char, char>不能用于构造std::initializer_list<std::pair<const char, char>>,(然后进一步构造std::map<char, char>

如果您将其更改为

operator pair<const char,char>() { return make_pair(a_, b_); }

operator std::map<char, char>::value_type () { return make_pair(a_, b_); }

代码可以正常工作。

答案 1 :(得分:3)

可以,但您忘记了关键点:map的{​​{1}}实际上是value_type,因此在您的示例中,您需要进行两次转换(pair<const Key, Value>Ppair<char, char>)与pair<char const, char> qmap见面。这是规则允许的另一种转换。

如果您将转换运算符更改为

value_type

您的代码compiles