我可以通过std :: ostream&到期望std :: ofstream的函数

时间:2011-08-11 06:00:03

标签: c++

我要做的是: 我想将我的错误消息erither重定向到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

3 个答案:

答案 0 :(得分:3)

没有。但事实恰恰相反。您可以将std::ofstream传递给期望std::ostream&的函数,或std::ofstream*传递给期望std::ostream*的函数。所以你的函数应该接受std::ostream ref或指针。

答案 1 :(得分:2)

将方法声明为:

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);
}

答案 2 :(得分:1)

类型应为std :: ostream。它完全不像你编写的那样工作,因为你的函数参数是一个引用而你的参数是一个指针。但要解决这个问题(无论哪种方式),它都能正常运作。

相关问题