5

コンソールへの書き込みとバイナリファイルへの書き込みの両方で、シフト演算子「 << 」をオーバーロードする必要があります..

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
4

2 に答える 2

4

operator char*inを取り除くFotografiaか、マークしexplicitます。

また、コードを に挿入するように制限する代わりにfstream、任意の に挿入することもできますbasic_ostream。これは引き続き で機能し、fstream他の形式の出力ストリームをより柔軟に使用できるようになります。これでエラーも解消されます。

于 2013-01-30T18:08:46.310 に答える
3

operator<<をオーバーロードしても意味がありませんstd::fstream。第一に、経験豊富な C++ プログラマーは std::fstream;をほとんど使用しないためです。std::ofstreamまたはを使用しますstd::ifstream。2 つ目は、一度 a を使用すると、とにかく<<戻り値が aになるため、 for が呼び出されることはありません。std::ostreamoperator<<ofstream

もちろん、オペレーターの実装もすべての規則に違反しています。オペレーターでファイルを開いたり閉じたりしません。演算子は、データをフォーマットするためのものです。 2 つの異なるフォーマットをサポートしたい場合、通常はマニピュレータを定義してどちらかを選択し、クライアントに決定させます。(std::ios_base::xalloc()追加の状態をどこに置くかについては、and company を参照してください。)

于 2013-01-30T18:23:52.103 に答える