C ++ OStream继承和操纵器

时间:2011-08-22 18:50:06

标签: c++ iostream

我有一个继承自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;
};

1 个答案:

答案 0 :(得分:1)

如果实现成员函数,则在重载解析中不考虑该相同函数的继承重载。如果您将自定义operator<<重载更改为朋友全局函数而不是成员,则应该可以正常工作。演员强制编译从operator<<()中定义的那些中选择ostream

不需要函数指针的特殊重载。