Проблема на самом деле с одним из конструкторов вашего класса:
base(int n);
Этот конструктор называется конвертирующим конструктором . Его можно использовать для преобразования int
в base
, поэтому это будет допустимо:
base x = 42;
Если вы не хотите разрешать это неявное преобразование, вы можете сделать конструктор explicit
:
explicit base(int n);
Интересный вопрос: "где неопределенность в fout << coeff[i];
?
Есть две функции-кандидата, между которыми компилятор не может выбирать (или не должен иметь возможность выбирать между ними; ваш компилятор «приятен» вам): одна - встроенная std::ostream
operator<<
перегрузка выглядит так:
std::ostream& operator<<(std::ostream&, double);
вторая - перегрузка вашего оператора, которая выглядит следующим образом:
std::ofstream& operator<<(std::ofstream&, const base&);
При первом кандидате первый аргумент требует преобразования из производной в основание: std::ofstream
необходимо преобразовать в std::ostream
для вызова функции. Второй аргумент, double
, точно соответствует.
Со вторым кандидатом первый аргумент, std::ofstream
, точно совпадает. Второй аргумент требует использования встроенного преобразования double
в int
, а затем использования вашего конструктора преобразования для преобразования из int
в base
.
Чтобы компилятор выбрал одну функцию-кандидата в качестве правильной для вызова, каждый из аргументов должен соответствовать как минимум соответствующему параметру кандидата, так же как и любому другому кандидату.
При наличии этих двух кандидатов первый аргумент лучше соответствует второму кандидату, но второй аргумент лучше соответствует первому кандидату, поэтому возникает неоднозначность.
Альтернативным решением было бы изменить вашу перегрузку так, чтобы первый аргумент совпадал с первым аргументом встроенного кандидата:
std::ostream& operator<<(std::ostream&, const base&);