我可以将 std::ostream& 传递给期望 std::ofstream 的函数吗

can i pass std::ostream& to a function expecting std::ofstream

本文关键字:std ofstream 期望 函数 ostream 我可以      更新时间:2023-10-16

我想做的是:我想将错误消息重定向到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。它不会像你编码的那样工作,因为你的函数参数是一个引用,你的参数是一个指针。但是修复它(无论哪种方式),它将工作。