#include <type_traits>
namespace foo {
struct Vector {
double x, y, z;
Vector(double x, double y, double z) :
x{x}, y{y}, z{z}
{}
template<class T>
Vector(const T& foreign) :
x{foreign.x}, y{foreign.y}, z{foreign.z}
{}
template<class T>
operator T() const
{
return T{x, y, z};
}
};
Vector makeAVector()
{
return {1, 2, 3};
}
}
namespace bar {
struct Vector3 {
using Scalar = double;
Scalar x, y, z;
Vector3(Scalar x, Scalar y, Scalar z) :
x{x}, y{y}, z{z}
{}
Vector3(const Vector3& other) :
x{other.x}, y{other.y}, z{other.z}
{}
Vector3(const Scalar *ptr) :
x{ptr[0]}, y{ptr[1]}, z{ptr[2]}
{}
};
void doSomething(const Vector3& v, double* x)
{}
void doSomething(const Vector3& v, const Vector3& x)
{}
}
int main()
{
bar::Vector3 a{2, 3, 4};
bar::doSomething( a, foo::makeAVector() );
}
I2luY2x1ZGUgPHR5cGVfdHJhaXRzPgoKbmFtZXNwYWNlIGZvbyB7CiAgICBzdHJ1Y3QgVmVjdG9yIHsKICAgICAgICBkb3VibGUgeCwgeSwgejsKCiAgICAgICAgVmVjdG9yKGRvdWJsZSB4LCBkb3VibGUgeSwgZG91YmxlIHopIDoKICAgICAgICAgICAgeHt4fSwgeXt5fSwgent6fQogICAgICAgIHt9CgogICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+CiAgICAgICAgVmVjdG9yKGNvbnN0IFQmIGZvcmVpZ24pIDoKICAgICAgICAgICAgeHtmb3JlaWduLnh9LCB5e2ZvcmVpZ24ueX0sIHp7Zm9yZWlnbi56fQogICAgICAgIHt9CgoKICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPgogICAgICAgIG9wZXJhdG9yIFQoKSBjb25zdAogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFR7eCwgeSwgen07CiAgICAgICAgfQogICAgfTsKCgogICAgVmVjdG9yIG1ha2VBVmVjdG9yKCkKICAgIHsKICAgICAgICByZXR1cm4gezEsIDIsIDN9OwogICAgfQp9CgoKbmFtZXNwYWNlIGJhciB7CgogICAgc3RydWN0IFZlY3RvcjMgewogICAgICAgIHVzaW5nIFNjYWxhciA9IGRvdWJsZTsKCiAgICAgICAgU2NhbGFyIHgsIHksIHo7CgogICAgICAgIFZlY3RvcjMoU2NhbGFyIHgsIFNjYWxhciB5LCBTY2FsYXIgeikgOgogICAgICAgICAgICB4e3h9LCB5e3l9LCB6e3p9CiAgICAgICAge30KCiAgICAgICAgVmVjdG9yMyhjb25zdCBWZWN0b3IzJiBvdGhlcikgOgogICAgICAgICAgICB4e290aGVyLnh9LCB5e290aGVyLnl9LCB6e290aGVyLnp9CiAgICAgICAge30KICAgICAgICAKICAgICAgICBWZWN0b3IzKGNvbnN0IFNjYWxhciAqcHRyKSA6CiAgICAgICAgICAgIHh7cHRyWzBdfSwgeXtwdHJbMV19LCB6e3B0clsyXX0KICAgICAgICB7fQoKICAgIH07CgogICAgdm9pZCBkb1NvbWV0aGluZyhjb25zdCBWZWN0b3IzJiB2LCBkb3VibGUqIHgpCiAgICB7fQoKICAgIHZvaWQgZG9Tb21ldGhpbmcoY29uc3QgVmVjdG9yMyYgdiwgY29uc3QgVmVjdG9yMyYgIHgpCiAgICB7fQoKfQoKCmludCBtYWluKCkKewogICAgYmFyOjpWZWN0b3IzIGF7MiwgMywgNH07CgogICAgYmFyOjpkb1NvbWV0aGluZyggYSwgZm9vOjptYWtlQVZlY3RvcigpICk7Cn0K
prog.cpp: In function ‘int main()’:
prog.cpp:66:45: error: call of overloaded ‘doSomething(bar::Vector3&, foo::Vector)’ is ambiguous
bar::doSomething( a, foo::makeAVector() );
^
prog.cpp:66:45: note: candidates are:
prog.cpp:53:10: note: void bar::doSomething(const bar::Vector3&, double*)
void doSomething(const Vector3& v, double* x)
^
prog.cpp:56:10: note: void bar::doSomething(const bar::Vector3&, const bar::Vector3&)
void doSomething(const Vector3& v, const Vector3& x)
^