ISO C ++ говорит, что это неоднозначно,

Я должен перегрузить оператор сдвига << «как для записи в консоли, так и для записи в двоичном файле ..

У меня все в порядке с перегрузкой ostream, хотя у меня возникли некоторые проблемы с перегрузкой fstream, вот оно:

в моем заголовке:

friend ostream &operator<<(ostream &, const Fotografia &);
friend fstream &operator<<(fstream &, const Fotografia &);

в моем файле cpp:

fstream &operator<<(fstream & miofile, const Fotografia & sorgente)
{
//Open the file
miofile.open("data.dat", ios::binary | ios::app);
if(!miofile) cerr << "Can't open the file\n";
miofile << strlen(sorgente.Titolo);
miofile << endl;
miofile << sorgente.Titolo;
//I close the file
miofile.close();
return miofile;

}

Вот ошибка, с которой я сталкиваюсь:

В функции `std :: fstream& оператор<<(Станд :: fstream&, const Fotografia&) ‘:

ISO C++ says that these are ambiguous, even though the worst conversion for the first is    better than the worst conversion for the second:

std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char, _Traits>&, const char*) [with _Traits = std::char_traits<char>]

std::fstream& operator<<(std::fstream&, const Fotografia&)

До сих пор я понимал, что существует неясность между только что созданной перегруженной функцией и стандартным fstream. << ,
Теперь я не понимаю, почему, потому что моя перегруженная функция должна работать только для класса «Fotografia» (который был создан мной), а я пытаюсь написать char *.

Я думал, что смогу решить эту проблему, вызвав оператор fstream с областью видимости «::», но я не уверен.

Может ли кто-нибудь помочь мне здесь, пожалуйста?
🙂

РЕДАКТИРОВАТЬ:

Я публикую код для заголовка и код для конструктора

         //Costruttore,distruttore,costruttore di copia,operatore di assegnazione.
Fotografia(char * titolo = "Untitled" , char * formato = ".jpeg");
~Fotografia() { delete [] Titolo; delete [] Formato;}
Fotografia(const Fotografia &);
Fotografia &operator=(const Fotografia &);

Это в cpp:

 Fotografia::Fotografia(char * titolo , char * formato)
{
Titolo = new char[strlen(titolo)+1];
strcpy(Titolo,titolo);
Formato = new char[strlen(formato)+1];
strcpy(Formato,formato);
} //Fine costruttore

5

Решение

Избавиться от operator char* в Fotografiaили отметьте это explicit,

Кроме того, вместо ограничения кода для вставки в fstreamВы можете вставить в произвольный basic_ostream, Это все равно будет работать для fstreamи даст вам больше гибкости в использовании других форм выходных потоков. Это также устранит ошибку.

4

Другие решения

Нет смысла перегружать operator<< за std::fstream,
Во-первых, потому что опытные программисты на C ++ почти не используют
std::fstream; они используют std::ofstream или же std::ifstream,
И второе, потому что, как только вы использовали <<, возвращаемое значение
std::ostream во всяком случае, так operator<< за ofstream
никогда бы не позвонил.

Конечно, ваша реализация оператора также нарушает все
из правил. Вы не открываете и не закрываете файл в операторе;
оператор для форматирования данных. Если ты хочешь
поддержка двух разных форматов, обычный способ будет определять
манипулятор, чтобы выбрать между ними, и пусть клиент решает.
(Увидеть std::ios_base::xalloc() и компания, где поставить
дополнительное состояние.)

3