2016-10-04 9 views
9

は、構造体の次の階層を考えてみましょう:オーバーロードされた仮想関数を隠す

struct I1 { 
    virtual void doit() = 0; 
}; 

struct I2 { 
    virtual void doit(int) = 0; 
}; 

struct I12 : I1, I2 { 
    using I1::doit; 
    using I2::doit; 
}; 

struct Derived : I12 { 
    void doit(int) override {} 
}; 

は(clang、または-Woverloaded-virtualg++を使用して)これをコンパイルするには、私に警告を与えます以下の場合、clangの下で正常にコンパイルされますが、g++ -Woverloaded-virtualはまだ警告を表示します。

struct I12 : I1, I2 { 
    using I1::doit; 
    void doit(int) override = 0; 
}; 

using I2::doitvoid doit(int) override = 0の違いはどこですか?純粋に、前者は、doitという2つのバージョンがあることをコンパイラーに知らせるのに十分だと思っていました。

+0

どのコンパイラを使用していますか?私はgccやMSVSで警告を得ることができませんが、私はclangで行います。 – NathanOliver

+0

はい、あなたはそれを隠しています。あなたの質問は何ですか?どのように冗長な警告を排除するには? – songyuanyao

+0

@ NathanOliver私はclangを使用しましたが、g ++を使用して警告を表示すると、動作が異なります。 – phimuemue

答えて

1

doitDerivedに隠されていると訴えています。修正:

struct Derived : I12 { 
    using I12::doit; // Bring all doit declarations from I12 into this scope. 
    void doit(int) override {} 
}; 
+0

私はあなたの魅力をお寄せいただきありがとうございます。私の具体的なケースでは、私は 'Derived1'、' Derived2'、...、 'doit1'、' doit2' ...を持っていますので、 'using'宣言はどこにでもありますが、可能な場合は一つの中心的な場所でしかありません。 – phimuemue

+0

@phimuemueこのような設計では、警告を消すほうが簡単かもしれません。 '-Wno-overloaded-virtual'さもなければ、これはC++での名前の隠蔽の仕方であるため、場所全体に 'using'を振りかざす必要があります。 –