不明确使用operator double()

时间:2015-09-16 12:10:03

标签: c++ operator-overloading implicit-conversion

我有一个Rectangle类,其转化运算符同时适用于doublestd::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++ wikibookoperator double用于将Rectangle个对象转换为double

那么这里发生了什么?是否与int传递给构造函数有关?如果是这样,为什么?

3 个答案:

答案 0 :(得分:12)

您没有操作员将矩形输出到流。 cout确实有一个带double的重载,您的类可以隐式转换为double,以便选择。

未选择字符串重载且不被视为歧义的原因是因为字符串的operator <<是成员函数,并且未包含在Demo source in Google Playmember 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}中推导出CharTTraitsAllocator类型因此,此重载不参与重载解析。 (回想一下,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;

    }
}