什么阻止此初始化工作?
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中?还是别的什么?
答案 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>
⟶ P
⟶pair<char, char>
)与pair<char const, char>
qmap
见面。这是规则允许的另一种转换。
如果您将转换运算符更改为
value_type
您的代码compiles。