namespace Foo {
class Deriv {};
class Another {};
Another operator* ( float x, const Deriv& d ) { return Another();}
}
namespace Bar {
typedef Foo::Deriv MyDeriv;
MyDeriv operator* (float x, const MyDeriv& d);
}
namespace Bar {
void f1() {
Bar::MyDeriv a;
Bar::MyDeriv b = 3.f * a;
}
}
void f2() {
Bar::MyDeriv a;
Bar::MyDeriv b = 3.f * a;
}
int main() {
// your code goes here
return 0;
}
Cm5hbWVzcGFjZSBGb28gewoKCWNsYXNzIERlcml2IHt9OwoJY2xhc3MgQW5vdGhlciB7fTsKCUFub3RoZXIgb3BlcmF0b3IqICggZmxvYXQgeCwgY29uc3QgRGVyaXYmIGQgKSB7IHJldHVybiBBbm90aGVyKCk7fQp9Cm5hbWVzcGFjZSBCYXIgewoJdHlwZWRlZiBGb286OkRlcml2IE15RGVyaXY7CglNeURlcml2IG9wZXJhdG9yKiAoZmxvYXQgeCwgY29uc3QgTXlEZXJpdiYgZCk7Cn0KCgpuYW1lc3BhY2UgQmFyIHsKCXZvaWQgZjEoKSB7CgkJQmFyOjpNeURlcml2IGE7CgkJQmFyOjpNeURlcml2IGIgPSAzLmYgKiBhOwoJfQp9Cgp2b2lkIGYyKCkgewoJQmFyOjpNeURlcml2IGE7IAoJQmFyOjpNeURlcml2IGIgPSAzLmYgKiBhOwoJCn0KCmludCBtYWluKCkgewoJLy8geW91ciBjb2RlIGdvZXMgaGVyZQoJcmV0dXJuIDA7Cn0=
prog.cpp: In function 'void Bar::f1()':
prog.cpp:19:24: error: ambiguous overload for 'operator*' (operand types are 'float' and 'Bar::MyDeriv {aka Foo::Deriv}')
Bar::MyDeriv b = 3.f * a;
^
prog.cpp:12:10: note: candidate: Bar::MyDeriv Bar::operator*(float, const MyDeriv&)
MyDeriv operator* (float x, const MyDeriv& d);
^
prog.cpp:8:10: note: candidate: Foo::Another Foo::operator*(float, const Foo::Deriv&)
Another operator* ( float x, const Deriv& d ) { return Another();}
^
prog.cpp: In function 'void f2()':
prog.cpp:25:23: error: conversion from 'Foo::Another' to non-scalar type 'Bar::MyDeriv {aka Foo::Deriv}' requested
Bar::MyDeriv b = 3.f * a;
^