コンソールへの書き込みとバイナリファイルへの書き込みの両方で、シフト演算子「 << 」をオーバーロードする必要があります..
fstreamのオーバーロードに問題がありますが、ostreamのオーバーロードには問題ありません。次のとおりです。
私のヘッダーで:
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& operator<<(std::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 << の間にあいまいさがあるということです。char * を書き込もうとしている間、オーバーロードされた関数はクラス「Fotografia」(私が作成したもの) に対してのみ機能するはずなので、今、私が理解していないのはその理由です。
「::」スコープで 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