我要做的是:
我想将我的错误消息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
答案 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。它完全不像你编写的那样工作,因为你的函数参数是一个引用而你的参数是一个指针。但要解决这个问题(无论哪种方式),它都能正常运作。