我有一个继承自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;
};
答案 0 :(得分:1)
如果实现成员函数,则在重载解析中不考虑该相同函数的继承重载。如果您将自定义operator<<
重载更改为朋友全局函数而不是成员,则应该可以正常工作。演员强制编译从operator<<()
中定义的那些中选择ostream
。
不需要函数指针的特殊重载。