У вас не может быть двух конструкторов (или каких-либо функций) с одинаковыми сигнатурами. Наилучшим решением, вероятно, является создание классов для ваших типов координат и их перегрузка. Например:
struct CartCoord {
CartCoord( double re, double img ) : mRe(re), mImg(img) {}
double mRe, mImg;
};
struct PolarCoord {
PolarCoord( double a, double v ) : mA(a), mV(v) {}
double mA, mV;
};
Тогда ваши конструкторы станут:
Complex( const CartCoord & c );
Complex( const PolarCoord & c);
Используется:
Complex c( CartCoord( 1, 2 ) );
Вы также можете использовать их с перегруженными операторами класса Complex. Например, если у вас есть двоичный оператор + для класса, определите как:
Complex operator+( const Complex &, const Complex & );
, то:
Complex a( CartCoord( 0, 0 ) );
Complex b = a + PolarCoord( 1, 1 );
Поскольку у нас есть конструктор преобразования из PolarCoord в Complex, он будет использоваться в выражении +. Это более естественно (IMHO), чем вызов статических функций для создания временных ..
Это пример изречения Кенига (или, по крайней мере, его версии) - всякий раз, когда возникает трудная проблема, вводите новый уровень классов для ее решения.