It might also be possible if FirstType has a non-explicit constructor that accepts a SecondType.
Code:
class First
{
int m;
public:
First(int n): m(n) {}
int get() const { return m; }
};
class Second
{
int m;
public:
Second(int n): m(n) {}
Second(First first): m(first.get()) {} //First can be inplicitly converted into Second
int get() const { return m; }
};
Second operator+(Second lhv, Second rhv)
{
return Second(lhv.get() + rhv.get());
}
int main()
{
Second s1(10), s2(5);
First f(5);
s2 = s1 + f;
s1 = f + s2;
}