这里我定义一个Date
,并指定用户定义的转换。
class Date {
private:
int day;
int month;
string dateStr;
public:
Date(int _day, int _month) : day(_day), month(_month) {}
operator const string() {
ostringstream formattedDate;
formattedDate << month << "/" << day;
dateStr = formattedDate.str();
return dateStr;
}
};
转换为时效果很好string
.
Date d(1, 1);
string s = d;
但为什么不能与它一起使用cout
直接地?
cout << d << endl; // The compiler complains that there is no suitable type marching << operator
但是,如果我使用char*
代替string
对于用户定义的转换,我可以将它与cout
直接地。为什么?
operator const char*() {
ostringstream formattedDate;
formattedDate << month << " / " << day;
dateStr = formattedDate.str();
return dateStr.c_str();
}
附:我知道超载<<
直接进行输出效果很好。但我的问题是:为什么不能使用<<
与用户定义的转换为std::string
?
注意std::string
是模板的实例化std::basic_string
, 的签名operator<< for std::string确实是:
template <class CharT, class Traits, class Allocator>
std::basic_ostream<CharT, Traits>&
operator<<(std::basic_ostream<CharT, Traits>& os,
const std::basic_string<CharT, Traits, Allocator>& str);
然后对于cout << d;
,模板参数std::basic_string
必须推导;但类型推导不考虑隐式转换;
类型推导不考虑隐式转换(除了上面列出的类型调整之外):这是重载解析的工作,稍后发生。
这意味着扣除将失败;那么没有候选函数是可行的。
But operator<< for const char*没有这样的问题;隐式转换生效,然后工作正常。
为了解决这个问题,可以使用显式转换来避免模板参数推导;或过载operator<<
在类型上Date
直接地。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)