c – 无法实现接口的[[deprecated]]方法

我想将我的界面的一些方法标记为已弃用.

为了向后兼容,我需要支持旧方法一段时间.

// my own interface for other
interface I {
    [[deprecated( "use 'bar' instead" )]]
    virtual void foo() = 0;
};

但Visual Studio 2015不允许我实现此接口:

// my own implementation
class IImpl : public I {
public:
    virtual void foo() override; // here goes warning C4996:
                                 // 'I::foo': was declared deprecated
};

我使用选项Treat Wanings as Errors(/ WX),因此无法编译此代码.

我尝试在本地忽略警告:

class IImpl : public I {
public:
#pragma warning(push)
#pragma warning(disable: 4996)
    virtual void foo() override;
#pragma warning(pop)
    // ... other methods are outside
};

但它没有效果.允许编译代码的唯一解决方案是忽略整个类声明的警告:

#pragma warning(push)
#pragma warning(disable: 4996)
class IImpl : public I {
public:
    virtual void foo() override;
    // ... other methods are also affected
};
#pragma warning(pop)

海湾合作委员会似乎做对了:

#pragma GCC diagnostic error "-Wdeprecated-declarations"

interface I {
    [[deprecated]]
    virtual void foo() = 0;
};

class IImpl : public I {
public:
    virtual void foo() override; // <<----- No problem here
};

int main()
{
    std::shared_ptr<I> i( std::make_shared<IImpl>() );
    i->foo(); // <<---ERROR: 'virtual void I::foo()' is deprecated [-Werror=deprecated-declarations]
    return 0;
}

这是MSVC的错误吗?
有没有办法在Visual Studio中正确使用弃用声明?

最佳答案 标准说:

Implementations may use the deprecated attribute to produce a diagnostic message in case the
program refers to a name or entity other than to declare it

但是IImpl :: foo的声明并没有引用I :: foo.

这段文字内容丰富,无需遵循这封信.实际上,一个实现可能会警告你它想要什么.我仍然认为这是一个错误.

它可以像这样解决:

// IInternal.h
struct I {
   virtual void foo() = 0; // no deprecation
};

// I.h
#include <IInternal.h>
[[deprecated( "use 'bar' instead" )]]
inline void I::foo() { 
    std::cerr << "pure virtual function I::foo() called\n"; 
    abort(); 
} 

//IImpl.h
#include <IInternal.h>
class IImpl : public I { ... // whatever
点赞