我必须重置shift运算符“<<”,以便在控制台中写入并在二进制文件上写入。
我对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&amp; operator&lt;&lt;(std :: fstream&amp;,const Fotografia&amp;)':
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&lt;&lt;之间存在歧义。 。 现在,我不明白为什么,因为我的重载函数应该只适用于“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
答案 0 :(得分:4)
摆脱operator char*
中的Fotografia
,或将其标记为explicit
。
此外,您可以插入任意fstream
,而不是将代码限制为插入basic_ostream
。这仍然适用于fstream
,并且可以更灵活地使用其他形式的输出流。这也可以消除错误。
答案 1 :(得分:3)
为operator<<
重载std::fstream
是没有意义的。
首先,因为经验丰富的C ++程序员几乎不会使用
std::fstream
;他们使用std::ofstream
或std::ifstream
。
第二,因为一旦你使用了<<
,返回值就是
无论如何std::ostream
,operator<<
为ofstream
永远不会被召唤。
当然,您对运营商的实施也违反了所有规定
规则。您不会在运营商中打开或关闭文件;
运算符用于格式化数据。 如果你想要
支持两种不同的格式,通常的方式是定义
操纵者在他们之间做出选择,让客户决定。
(参见std::ios_base::xalloc()
和公司,了解放置的位置
附加状态。)