我有一个Rectangle
类,其转化运算符同时适用于double
和std::string
:
class Rectangle
{
public:
Rectangle(double x, double y) : _x(x), _y(y) {}
operator std::string ();
operator double ();
private:
double _x, _y;
double getArea() {return _x * _y;}
};
int main()
{
Rectangle r(3, 2.5);
cout << r << endl;
return 0;
}
我不明白为什么调用operator double()
而不是operator std::string()
。
据我所知,根据C++ wikibook,
operator double
用于将Rectangle
个对象转换为double
。
那么这里发生了什么?是否与int
传递给构造函数有关?如果是这样,为什么?
答案 0 :(得分:12)
您没有操作员将矩形输出到流。 cout
确实有一个带double
的重载,您的类可以隐式转换为double
,以便选择。
未选择字符串重载且不被视为歧义的原因是因为字符串的operator <<
是成员函数,并且未包含在Demo source in Google Play和member overload 集中cout
。如果我们发表评论operator double
,我们可以看到non member overload。
如果我们想要调用operator string
,那么我们需要将r
显式地转换为字符串。 we get a compiler error
答案 1 :(得分:6)
由于您没有为operator<<
提供Rectangle
重载,编译器会考虑其他参数可以转换为参数类型的重载。
如果任何重载是模板,则在重载解析之前会对它们进行模板参数替换。编译器尝试从提供给函数的参数类型中推导出模板参数。
由于模板参数替换失败,因此未考虑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);
模板参数替换不考虑用户定义的转换,因此编译器无法从类型{{1}中推导出CharT
,Traits
或Allocator
类型因此,此重载不参与重载解析。 (回想一下,Rectangle
只是std::string
的typedef。)
因此,有一个std::basic_string<char, std::char_traits<char>, std::allocator<char>>
的重载比其他任何重载更好,那就是operator<<
重载。不是模板,而是类模板的成员函数。
double
答案 2 :(得分:0)
双重载没有其他特殊类型重载的特殊之处。在这种情况下,它是唯一可用的原始重载。 编译器对int,char等的行为相同。
请注意,如果我们有多个原始类型重载,则编译器将抛出
server {
listen 443 ssl;
server_name example.com
location / {
# prevents 502 bad gateway error
proxy_buffers 8 32k;
proxy_buffer_size 64k;
# redirect all HTTP traffic to localhost:8088;
proxy_pass http://0.0.0.0:8000/;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#proxy_set_header X-NginX-Proxy true;
# enables WS support
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 999999999;
}
}