#include <stdio.h>
class Double
{
public:
Double operator +( Double other ){ printf( "Double::operator+(Double)\n" ); return *this; }
};
class Float
{
public:
operator Double(){ printf( "Float to Double\n" ); return Double(); }
};
class Float2
{
public:
operator Double(){ printf( "Float2 to Double\n" ); return Double(); }
Double operator +( Double other ){ printf( "Float2::operator+(Double)\n" ); return Double(); }
};
int main( void )
{
Double d;
Float f;
Float2 f2;
printf( "[1]\n" );
d + d;
printf( "[2]\n" );
d + f; // fはDoubleへ暗黙の型変換が発生する。
/* error: 左オペランドに暗黙の型変換は発生しないのでエラーになる。
f + d;
*/
printf( "[3]\n" );
f2 + d; // 左オペランドに暗黙の型変換は発生しないが、Float2はoperator+(Double)を持っているのでエラーにならない。
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CgpjbGFzcyBEb3VibGUKewpwdWJsaWM6CiAgRG91YmxlIG9wZXJhdG9yICsoIERvdWJsZSBvdGhlciApeyBwcmludGYoICJEb3VibGU6Om9wZXJhdG9yKyhEb3VibGUpXG4iICk7IHJldHVybiAqdGhpczsgfQp9OwpjbGFzcyBGbG9hdAp7CnB1YmxpYzoKICBvcGVyYXRvciBEb3VibGUoKXsgcHJpbnRmKCAiRmxvYXQgdG8gRG91YmxlXG4iICk7IHJldHVybiBEb3VibGUoKTsgfQp9OwpjbGFzcyBGbG9hdDIKewpwdWJsaWM6CiAgb3BlcmF0b3IgRG91YmxlKCl7IHByaW50ZiggIkZsb2F0MiB0byBEb3VibGVcbiIgKTsgcmV0dXJuIERvdWJsZSgpOyB9CiAgRG91YmxlIG9wZXJhdG9yICsoIERvdWJsZSBvdGhlciApeyBwcmludGYoICJGbG9hdDI6Om9wZXJhdG9yKyhEb3VibGUpXG4iICk7IHJldHVybiBEb3VibGUoKTsgfQp9OwoKCmludCBtYWluKCB2b2lkICkKewogICAgRG91YmxlICBkOwogICAgRmxvYXQgICBmOwogICAgRmxvYXQyICBmMjsKICAgIAogICAgcHJpbnRmKCAiWzFdXG4iICk7IAogICAgZCArIGQ7CiAgICAKICAgIHByaW50ZiggIlsyXVxuIiApOwogICAgZCArIGY7IC8vIGbjga9Eb3VibGXjgbjmmpfpu5njga7lnovlpInmj5vjgYznmbrnlJ/jgZnjgovjgIIKICAgIAogICAgLyogZXJyb3I6IOW3puOCquODmuODqeODs+ODieOBq+aal+m7meOBruWei+WkieaPm+OBr+eZuueUn+OBl+OBquOBhOOBruOBp+OCqOODqeODvOOBq+OBquOCi+OAggogICAgZiArIGQ7CiAgICAqLwogICAgCiAgICBwcmludGYoICJbM11cbiIgKTsKICAgIGYyICsgZDsgLy8g5bem44Kq44Oa44Op44Oz44OJ44Gr5pqX6buZ44Gu5Z6L5aSJ5o+b44Gv55m655Sf44GX44Gq44GE44GM44CBRmxvYXQy44Gvb3BlcmF0b3IrKERvdWJsZSnjgpLmjIHjgaPjgabjgYTjgovjga7jgafjgqjjg6njg7zjgavjgarjgonjgarjgYTjgIIKICAgIAogICAgcmV0dXJuIDA7Cn0=