【问题标题】:Incompatible destructor compiler warning when from inheriting from std::streambuf从 std::streambuf 继承时不兼容的析构函数编译器警告
【发布时间】:2014-03-01 19:24:07
【问题描述】:

std::streambuf 继承时,我收到 ICL 编译器警告,说析构函数不兼容,知道我在这里做错了什么吗?使其成为虚拟析构函数也不起作用。

警告 #809:虚函数的异常规范 "CAbcBuffer::~CAbcBuffer" 与覆盖的不兼容 函数“std::basic_streambuf<_elem _traits>::~basic_streambuf [with _Elem=char, _Traits=std::char_traits]"

class CAbcBuffer : public std::streambuf
{
    protected:
        /** Work buffer */
        char *buffer;
    public:
        explicit CAbcBuffer()
        {
            /*
            Stores the beginning pointer, the next pointer, and the end pointer for the 
            input buffer
            */
            buffer = new char[100];
            std::streambuf::setg(buffer, buffer, buffer);
        }

        ~CAbcBuffer() {
            delete [] buffer;
        }
}

【问题讨论】:

    标签: c++ iostream icc streambuf


    【解决方案1】:

    您的析构函数缺少throw() 声明。这将解决问题:

    ~CAbcBuffer() throw() {
        delete [] buffer;
    }
    

    【讨论】:

    • 那行得通。如果您也解释原因,我会给您+1。我认为从析构函数中抛出异常是个坏主意,那么为什么std::streambuf 会这样做呢?文档还说析构函数是禁止抛出的,请参阅cplusplus.com/reference/streambuf/streambuf/~streambuf
    • 从析构函数中抛出异常一个可怕的想法。但是 throw() 就是这个意思——它是一个承诺扔任何东西。
    • 另一方面,实现声明streambuf析构函数不抛出是非法的。他的原始代码是正确的,应该可以在符合要求的实现上工作。
    • @James:你是对的。除非您省略 /Za 编译器开关,否则您似乎无法在 MSVC 中关闭此行为,我认为这非常违反直觉,因为 /Za 应该禁用 MS特定的非标准行为。
    猜你喜欢
    • 2017-05-17
    • 2017-08-05
    • 1970-01-01
    • 1970-01-01
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-15
    相关资源
    最近更新 更多