3
的[[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
};
我使用選項款待Wanings視爲錯誤(/ 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++的錯誤嗎? 是否有任何方法可以在Visual Studio中正確使用已棄用聲明?
什麼是聲明一個函數'[已廢棄]'然後禁用警告的意義呢? – nwp
http://stackoverflow.com/a/295229/612920 – Mansuro
@nwp,聲明是爲我的界面的用戶。我是接口的提供者。 –