gpt4 book ai didi

c++ - 无法实现接口(interface)的 [[deprecated]] 方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:08:08 25 4
gpt4 key购买 nike

我想将我界面的某些方法标记为已弃用。为了向后兼容,我需要在一段时间内支持旧方法。

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

但是 Visual Studio 2015 不允许我实现这个接口(interface):

// 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)

GCC 似乎让事情变得正确:

#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++的bug?有什么方法可以在 Visual Studio 中正确使用 deprecated 声明?

最佳答案

标准说:

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

关于c++ - 无法实现接口(interface)的 [[deprecated]] 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39023018/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com