2016-08-18 6 views
3

私のインタフェースのいくつかのメソッドを非推奨にしたいとします。 下位互換性のために、しばらく前のメソッドをサポートする必要があります。インタフェースの[[廃止予定]]メソッドを実装できません

// 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 
}; 

私は(/ WX)エラーとしてオプションにトリートWaningsを使用をので、このコードはできませんコンパイルされる。

私はローカルに警告を無視しよう:

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での非推奨の宣言を正しく使用する方法はありますか?

+0

して、警告を無効にします。

このように回避することができますか? – nwp

+0

http://stackoverflow.com/a/295229/612920 – Mansuro

+0

@nwpこの宣言は、自分のインターフェイスのユーザー向けです。私はインターフェイスのプロバイダです。 –

答えて

2

標準は言う: プログラムはそれを

が、宣言を宣言する以外の名前またはエンティティを指す場合に

実装は、診断メッセージを生成するために非推奨属性を使用してもよいです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 
関連する問題