我想将我的界面的一些方法标记为已弃用.
为了向后兼容,我需要支持旧方法一段时间.
// 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