2016-07-07 2 views
0

C++では、タイプSymIntPolyのオブジェクトを構築することができず、その上にf()を呼び出します。以下はクラスと構造です。C++多重継承:関数の不一致?

template<typename T> 
struct SymPoly 
{ 
    T f() { return this->x; } 
}; 

struct IntPoly 
{ 
    int x; 
    virtual int f() = 0; 
}; 

struct SymIntPoly : public IntPoly, public SymPoly<int> 
{ 
}; 

(すなわち、彼らは同じ内部の署名を持っていない?)

は別の何かである私がコンパイラのことは知らないが、私は、コンパイラは同じ機能として二つの機能を扱わないことを感じます私がやろうとしていることの方法?

+2

あなたはどちらを呼ぶと思われましたか?さらに、 'SymPoly'は' x'を持たず、 'IntPoly'は抽象型です。 – LogicStuff

+0

'SymIntPoly'に' f'を定義する必要があります。そうしないと、クラスは抽象化したままになり、インスタンス化することはできません。一度 'f'を定義すると' f() 'の呼び出しにあいまいさはありません。 – Holt

+0

1つの問題は、テンプレートクラスの 'return this-> x;'が意味をなさないということです。なぜあなたがこれをしたいのかを知ることは難しいです。しかし、あなたはCRTPのパターンにつまずくかもしれません。それはGoogleにあります。 – Bathsheba

答えて

0

あなたはその貧弱なコンパイラをたくさん求めています。もしそれが細いものを許し始めるならば、状況は非常にあいまいになる可能性があります。

幸いにも、あなたが望むものを見つけ出すのを助けるのは難しくありません。試してみてください

template<typename T> 
struct SymPoly 
{ 
    virtual T getX() =0; 
    T f() { return getX(); } 
}; 

struct IntPoly 
{ 
    int x; 
    virtual int f() = 0; 
}; 

struct SymIntPoly : public IntPoly, public SymPoly<int> 
{ 
    int getX() { return IntPoly::x; } 
    int f() { return SymPoly<int>::f(); } 
}; 

これはコンパイルします。