我可以将 std::ostream& 传递给期望 std::ofstream 的函数吗
can i pass std::ostream& to a function expecting std::ofstream
我想做的是:我想将错误消息重定向到std::cerr或一个文件取决于command-line
参数。如果没有提供日志文件,那么程序应该在屏幕上输出错误信息。以下是我的方法:
class A {
void SetLogFileStream(T& err_outstream);
};
//main.cpp A a;
std::string filename;
T1* t1;
if(argc>2) {
filename = argv[1]; //if provided by command line
std::ofstream fp(filename);
t1 = &fp;
}
else {
std::ostream* err_outstream = &std::cerr;
t1 = err_outstream;
}
a.SetLogFileStream(t1);
函数SetLogFileStream
的参数类型应该是什么或类型为T1
这样我就可以传递一个指针到文件或std::cerr
No。但事实恰恰相反。可以将std::ofstream
传递给期望std::ostream&
的函数,也可以将std::ofstream*
传递给期望std::ostream*
的函数。所以你的函数应该接受std::ostream
ref指针。
这样声明方法:
class A {
void SetLogStream(std::ostream& err_outstream);
};
你的代码有几个问题。打开的文件流超出作用域并被销毁。你需要像这样修复它:
std::ofstream f; // <-- this have to remain in scope while you use it for 'a'
A a;
if(args > 2) {
f.open(argv[1]);
a.SetLogStream(f);
} else {
a.SetLogStream(cerr);
}
类型应为std::ostream。它不会像你编码的那样工作,因为你的函数参数是一个引用,你的参数是一个指针。但是修复它(无论哪种方式),它将工作。
相关文章:
- std::ofstream 作为类成员删除复制构造函数?
- C++:std::ofstream 方法 open() 在第二次迭代时擦除打开的 ifstream 文件
- 如何在 std::ofstream 和 std::cerr 之间切换
- 为什么将字符串输出到未命名的 std::ofstream 反而给了我一个十六进制数?
- 如何使用 std::cout 或 std::ofstream 作为单个函数的输入?
- 将 boost stream_buffer 与 std::ofstream 结合使用
- 对 std::ofstream 进行空文件检查
- 将 std::ofstream 对象作为参数传递给类方法
- 为什么 std::ofstream 会在没有 std::ios_base::trunc 的情况下截断?
- std :: ofstream,覆盖错误的文件行
- std :: ofstream-没有比1023(即时冲洗)更长的缓冲字符串
- 如何超载std :: ofstream :: put()
- 返回"Cannot convert from 'std::ofstream {aka std::basic_ofstream<char>}' to bool"错误
- std::ofstream 会自动在 之后添加回车符 (CR; \r)
- std::ofstream 追加文件
- 使用std:ofstream时,将目录的副本检查到文件中
- C++线程:无法将参数 1 从 'const std::ofstream' 转换为 'std::ofstream &'
- 为浮点数配置std :: ofStream格式
- 重定向std:cout到std::ofstream,得到一个错误
- 使用std :: ofstream中的c 中的float变量输出