2016-03-12 44 views
0

做一些重构,我在一类移动一些代码后得到一个错误成员函数:错误与ostream的定义

std::ostream logStream;   // <-- error 
std::filebuf fileBuffer; 

// Send the output either to cout or to a file 
if(sendToCout) { 
    logStream.rdbuf(std::cout.rdbuf()); 
} 
else { 
    fileBuffer.open("out.txt", std::ios_base::out | std::ofstream::app); 
    logStream.rdbuf(&fileBuffer); 
} 

logStream << "abcd..." << std::endl; 

这是编译器错误消息:

file.cpp:417: error: calling a protected constructor of class 'std::__1::basic_ostream<char>' 
     std::ostream logStream; 
        ^

难道这是一个办法?

std::filebuf fileBuffer; 
std::ostream logStream(&fileBuffer); 

... 

if(sendToCout) { 
    logStream.rdbuf(std::cout.rdbuf()); 
} 
+0

检查[可用构造函数调用](http://en.cppreference.com/w/cpp/io/basic_ostream/basic_ostream)。你需要传递'fileBuffer'指针。 –

回答

0

如果你看到如this std::ostream constructor reference您将看到唯一的公共构造函数是指向一个std::streambuf对象的指针,例如您的变量fileBuffer

所以要解决你的问题的一个方法是做

std::filebuf fileBuffer; 
std::ostream logStream(&fileBuffer); 

一个更好的解决方案是使用std::ofstream如果你想输出到文件。

如果你想要一个更通用的解决方案,它应该可以使用任何类型的输出流,那么重新设计使用参考文献而不是一个可能的解决方案。

或者,你知道,试着找到一个现有的日志库,它已经为你处理了一切。

+0

我根据你的回答扩展了我的问题。它可以工作吗? – Pietro