簡體   English   中英

我可以將 std::ostream& 傳遞給期望 std::ofstream 的 function

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

我想要做的是:我想根據command-line參數將我的錯誤消息重定向到 std::cerr 或文件。 如果沒有提供日志文件,那么程序應該 output 屏幕上的錯誤消息。 這是我的方法:

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

function SetLogFileStream的參數類型或T1類型應該是什么,以便我可以將指針傳遞給文件或std::cerr

不,但反過來也是如此。 您可以將std::ofstream傳遞給期望std::ostream&的 function ,或將std::ofstream*傳遞給期望std::ostream*的 function 。 因此,您的 function 應該接受std::ostream引用或指針。

將方法聲明為:

class A {
    void SetLogStream(std::ostream& err_outstream);
};

您的代碼有幾個問題。 打開的文件 stream 脫離 scope 並被銷毀。 你需要像這樣修復它:

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。 它不會完全按照您的編碼工作,因為您的 function 參數是一個引用,而您的參數是一個指針。 但是解決這個問題(無論哪種方式),它都會起作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM