2017-03-22 11 views
1
struct Base 
{ 
}; 

struct DerOne : Base 
{ 
}; 

struct DerTwo : Base 
{ 
}; 

struct Joined : DerOne, DerTwo 
{ 
    using Base::Base; 
}; 

int main() 
{ 
    Joined j; 
    return 0; 
} 

が生成せずにコンパイルしながらC3881、それはグラムで何の問題++

それがで正常に動作しながら、C3881のみ、Visual Studioで直接ベース

からコンストラクタを継承することができ

エラーg ++。このコードは正しいですか?

答えて

1

これはGCCのバグです。それが何をしているのかは、標準をチェックしなくてもうまくいかない。それを呼ぶだろう何DerOneDerTwoコンストラクタが存在しないため、

GCCで
#include <stdio.h> 

struct Base { 
    Base() { puts("Base()"); } 
    Base(int) { puts("Base(int)"); } 
}; 

struct DerOne : Base { }; 

struct DerTwo : Base { }; 

struct Joined : DerOne, DerTwo { 
    using Base::Base; 
}; 

int main() { 
    Joined j {4}; 
} 

が、これはJoined(int)コンストラクタがBase(int)署名から作成することができますが、それコールBase(int)実装をしません(とすることはできません)、これにより、Base()が2回印刷されます。

clangはVisual Studioのようにそれを拒否します。

+0

このバグがどのように長続きしたかは奇妙です。ところで、「puts」をありがとう。私は今まで自分のバージョンを実装しました! – kim366

+0

少し話題です: '結合しました 'が' Base'のメソッドを強制的に呼び出すことはできますか?それとも私は手動で行う必要がありますか? – kim366

+0

@ kim366ああ、工事の後、普通の方法を意味するのだろうか?手動で行う必要がありますが、複数の継承があることに注意してください。そうする必要があるかもしれない2つの 'Base'インスタンスがあります。 – hvd

関連する問題