2017-11-06 15 views
-6

はサンプルコードです:仮想継承し、デフォルトコンストラクタ

#include <iostream> 
#include <utility> 
using namespace std; 

struct D; 
struct X {}; 
struct Y {}; 


template <typename T> 
struct A // A : ASequencialPlanningJobQueueFactory 
{ 
    A() = delete; 
    A(T* t) { cout << "A constructor" << endl; } 
}; 

struct B : A<B> // B : AThermostatedRotorJobQueueFactory 
{ 
    B(B* b, const X& x, const Y& y) : A(b) { cout << "B constructor" << endl; } 
}; 

template <typename T> 
struct C : T // C : PlanningJobQueueFactoryStub 
{ 
    template <typename... Args> 
    C(Args&&... args) : T(std::forward<Args>(args)...) { cout << "C constructor" << endl; } 
}; 

struct D : C<B>  // D: ThermostatedRotorJobQueueFactoryStub 
{ 
    D(const X& x, const Y& y) : C(this, x, y) { cout << "D constructor" << endl; } 
}; 

int main() 
{ 
    X x; 
    Y y; 

    D d(x, y); 
    cout << "----------" << endl; 

    return 0; 
} 

私はBに仮想継承を追加する場合、のように:

struct B : virtual A<B> 
{ 
    B(B* b, const X& x, const Y& y) : A(b) { cout << "B constructor" << endl; } 
}; 

コードはもうコンパイルされません。どうして ?

エラーが見つかりました。 クランとgcc仮想継承で...

+0

あなたの質問にユーザーが回答できるようにするには、エラーについてより具体的に説明する必要があります。あなたの[mcve]から得た正確なエラーを組み込むためにあなたの投稿を編集してください(できれば、コピー+貼り付けを使用して転写エラーを避ける)。 –

答えて

1

非常に有用ではなかった、ほとんどの派生クラスはそう、仮想基本コンストラクタを呼び出す必要があります。

struct D : C<B>  // D: ThermostatedRotorJobQueueFactoryStub 
{ 
    D(const X& x, const Y& y) : A(this), C(this, x, y) { cout << "D constructor" << endl; } 
}; 

しかし、それはC<B>についても同様である。

template <> 
struct C<B> : B 
{ 
    template <typename... Args> 
    C(Args&&... args) : A(this), B(std::forward<Args>(args)...) { 
     cout << "C constructor" << endl; 
    } 
}; 
+0

ああ、はい...ありがとう! – Oodini