C++ 从std::streambuf继承时出现不兼容的析构函数编译器警告

C++ 从std::streambuf继承时出现不兼容的析构函数编译器警告,c++,iostream,icc,streambuf,C++,Iostream,Icc,Streambuf,从std::streambuf继承时,我收到一条ICL编译器警告,说析构函数不兼容,你知道我这里做错了什么吗?将其设置为虚拟析构函数也不起作用 警告#809:虚拟函数的异常规范 “CAbcBuffer::~CAbcBuffer”与重写的不兼容 函数“std::basic_streambuf::~basic_streambuf[with _Elem=char,_Traits=std::char_Traits]” 您缺少析构函数的throw()声明。这将解决问题: ~CAbcBuffer() thr

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

警告#809:虚拟函数的异常规范 “CAbcBuffer::~CAbcBuffer”与重写的不兼容 函数“std::basic_streambuf::~basic_streambuf[with _Elem=char,_Traits=std::char_Traits]”


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

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

这很有效。如果你解释一下原因,我会把你的分数提高+1。我认为从析构函数抛出异常是个坏主意,那么为什么
std::streambuf
会这样做呢?文档还说析构函数是一个禁止抛出的方法,请参阅从析构函数抛出异常是一个可怕的想法。但是throw()的意思正是——它承诺不抛出任何东西。另一方面,实现声明streambuf析构函数no throw是非法的。他的原始代码是正确的,应该可以在一致的实现上工作。@James:你说得对。除非省略/Za编译器开关,否则在MSVC中似乎无法关闭此行为,我认为这非常违反直觉,因为/Za应该禁用特定于MS的非标准行为。
~CAbcBuffer() throw() {
    delete [] buffer;
}