Я должен перегрузить оператор сдвига << «как для записи в консоли, так и для записи в двоичном файле ..
У меня все в порядке с перегрузкой 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
Избавиться от operator char*
в Fotografia
или отметьте это explicit
,
Кроме того, вместо ограничения кода для вставки в fstream
Вы можете вставить в произвольный basic_ostream
, Это все равно будет работать для fstream
и даст вам больше гибкости в использовании других форм выходных потоков. Это также устранит ошибку.
Нет смысла перегружать operator<<
за std::fstream
,
Во-первых, потому что опытные программисты на C ++ почти не используют
std::fstream
; они используют std::ofstream
или же std::ifstream
,
И второе, потому что, как только вы использовали <<
, возвращаемое значение
std::ostream
во всяком случае, так operator<<
за ofstream
никогда бы не позвонил.
Конечно, ваша реализация оператора также нарушает все
из правил. Вы не открываете и не закрываете файл в операторе;
оператор для форматирования данных. Если ты хочешь
поддержка двух разных форматов, обычный способ будет определять
манипулятор, чтобы выбрать между ними, и пусть клиент решает.
(Увидеть std::ios_base::xalloc()
и компания, где поставить
дополнительное состояние.)