Thank you so much, I know what I should do. On Tue, Aug 3, 2010 at 7:53 AM, Armin Burgmeier <[email protected]> wrote:
> Tao Wang wrote: > > On Tue, Aug 3, 2010 at 1:20 AM, Armin Burgmeier <[email protected] <mailto: >> [email protected]>> wrote: >> >> On Tue, 2010-08-03 at 00:48 +1000, Tao Wang wrote: >> > Hi, >> > >> > I'm not sure whether here is the right place for my question, I'm >> > sorry if I'm wrong. >> > >> > I have a class A, and one of its constructor use 'const >> > Glib::ustring&' as parameter. So, I think any value of type 'char*', >> > 'std::string', 'Glib::ustring' should be accepted by the >> constructor. >> > And I have a function, one of its parameter is 'const A&'. Because I >> > have the conversion constructor in A, so I think the function can >> > accept the value of type 'char*', 'std::string', 'Glib::ustring' as >> > parameter and automatically convert it to A. >> >> What constructors exactly does A have? There has to be one for const >> char*, std::string and Glib::ustring. Implicit conversion works only if >> the conversion can be done directly, not if intermediate types would >> need to be constructed. >> >> >> Thanks for your reply. Could you check the code in pastebin for the >> exactly code snippet? http://pastebin.com/tMakRmSu >> >> I'm not quite understand here, I think the it can directly convert from >> char* and std::string to Glib::ustring. It's not necessary to convert them >> explicitly. >> >> And if it is not able to be converted directly, then why line 25, 26 and >> > > because it's calling the Glib::ustring constructor. There is exactly one > (implicit) conversion from const char* or std::string to Glib::ustring > happening. > > 38, 39 works? >> > > Same thing with operator= instead of the constructor. operator= has a > Glib::ustring as an argument and both times the arguments can be implicitly > converted to it. > > > And for line 33, 34, I just explicit convert it to class > >> 'A', then it's also works. >> > > I *guess* that (A)something is the same as something(A), at least if > something has not defined a conversion operator. > > > Why only certain implicit conversion didn't work? >> > > Lines 42 and 43 do not work because the function argument is an A, not a > Glib::ustring. Only a Glib::ustring can be implicitly converted to an A, via > the constructor, but not std::string or const char*. This would require two > conversions (const char* -> Glib::ustring -> A) which is never done > implicitly. > > I am not so sure about lines 29 and 30. I would have guessed this is > equivalent to 25 and 26. It seems like it wants to call (the implicitly > defined) A& operator=(const A&) instead. > > > >> > However, the function can only accept the value of type 'A' or >> > 'Glib::ustring' as parameter, it cannot automatically do the >> > conversion of 'char*' and 'std::string'. I got following error >> > message: >> > >> > error: conversion from ‘const char [6]’ to non-scalar type ‘A’ >> > requested >> > error: conversion from ‘std::string’ to non-scalar type ‘A’ >> requested >> > error: invalid initialization of reference of type ‘const A&’ from >> > expression of type ‘const char*’ >> > error: invalid initialization of reference of type ‘const A&’ from >> > expression of type ‘std::string’ >> > >> > I extract the problem and posted the code here: >> > http://pastebin.com/tMakRmSu >> > >> > It looks like that I have to explicit convert them to A, which is >> not >> > the way I want to, I hope those conversion can be implicit. >> > >> > Could you help me figure out why my code is wrong? Why the >> > automatically conversion doesn't work? How can I make those >> conversion >> > implicit? >> > > There are probably many ways. For example you could make set_value a > template: > > template<typename T> > void set_value(const T& value) > { > A a(value); > // ...; > } > > Armin > -- Regards Tao Wang
_______________________________________________ gtkmm-list mailing list [email protected] http://mail.gnome.org/mailman/listinfo/gtkmm-list
