我有一個類從ostream
繼承,但操縱器無法編譯。例如:C++ OStream繼承和機械手
QLogger &logger = QLogger::getInstance();
logger << hex << 10 << endl;
抱怨約logger << hex
。如果我將記錄器投到ostream
它會起作用,但這是相當不利的。
如何擴展我的班級,使其具有操作員的行爲ostream
?
感謝,
肯尼
class LIBEXPORT QLogger: public std::ostream
{
friend class boost::thread_specific_ptr<QLogger>;
friend class QLoggerFunnel;
public:
// Priority for message filtering.
//
// DEBUG Detailed information that may be useful during development or troubleshooting.
// NORMAL Message will be useful during normal operation.
// WARNING Message indicates an unhealthy condition but the system should continue to operate.
// FAULT Message indicates a critical error. The system may not operate normally.
enum Priority
{
DEBUG, NORMAL, WARNING, FAULT
};
// DEPRECATED: Defined for backward compatibility.
static const Priority LOW = NORMAL;
static const Priority HIGH = WARNING;
static const Priority URGENT = FAULT;
// Returns a reference to the global instance.
static QLogger& getInstance();
// DEPRECATED: Use instead: QLogger::instance() << "Example message." << std::endl
static AWI_DEPRECATED QLogger& stream(QLogger::Priority priority = NORMAL);
QLogger &operator<<(Priority p);
// Messages with a priority below the threshold are discarded.
void setThreshold(Priority priority);
Priority getThreshold(void) const;
// Set the priority of messages.
void setPriority(Priority priority);
Priority getPriority(void) const;
protected:
static void handleThreadExit(QLogger *logger);
QLogger();
QLogger(const QLogger&);
virtual ~QLogger();
QLogger& operator=(const QLogger&);
void write(std::ostream &destination);
void synchronize(void);
// Prepends information to each line of its associated output stream.
class StampBuffer: public std::stringbuf
{
public:
StampBuffer();
virtual ~StampBuffer();
// String to be displayed before each line.
void setPreamble(const char *p);
virtual int sync();
void write(std::ostream &destination);
protected:
boost::mutex _mutex;
std::stringstream _stream1;
std::stringstream _stream2;
// Active stream being written to.
std::stringstream *_write;
std::stringstream *_read;
const char *_preamble;
};
class NullBuffer: public std::stringbuf
{
public:
NullBuffer();
virtual ~NullBuffer();
virtual int overflow(int c)
{
return (c);
}
};
StampBuffer _buffer;
NullBuffer _null_buffer;
Priority _threshold;
Priority _priority;
};
這可能有助於查看「記錄器」的聲明。 –
對不起。我應該格式化該代碼。 – Kenny
我添加了聲明。它包括我使用納瓦茲的建議的實驗。 – Kenny