2012-02-03 35 views
0
template <class T, class U, class Child> 
class Parent { 
public: 
    virtual T blah() { 
    return gaga; 
    } 
protected: 
    T gaga; 
}; 

class Child : public Parent<double, double, Child> { 
    virtual void blah(int overloaded) { 
    } 

    virtual void func() { 
    blah(); 
    } 
}; 

int main() { 
    Child* p = new Child(); 
} 

上記のコードがコンパイルされないのはなぜですか?なぜ私はそのような仮想関数をオーバーロードできないのですか?仮想テンプレート関数のオーバーロード

私は取得していますエラー:Child

prog.cpp: In member function ‘virtual void Child::func()’: 
prog.cpp:16: error: no matching function for call to ‘Child::blah()’ 
prog.cpp:12: note: candidates are: virtual void Child::blah(int) 
prog.cpp: In function ‘int main()’: 
prog.cpp:21: warning: unused variable ‘p’ 

答えて

4

方法void blah(int)Parentで継承されたT blah()を隠します。あなたはChildにライン

using Parent::blah; 

を追加することによって、それを再表示することができます。 Parent::blah()にアクセスできるようにするには、usingステートメントがパブリックアクセスセクションにあることを確認する必要があります。だから、すべてにParent::blah()が見えるようにするChildの先頭に

public: 
    using Parent::blah; 
private: 
    ... 

を追加する必要があります。 blah()ではなく、Parent::blah()で明示的に基本クラスメソッドを参照することもできます。詳細はhereです。

+0

ありがとうございました。問題が修正され、クラス内で使用できるようになりました...しかし、Parent :: blah()を外部で使用することはできません。例:p-> blah(); – user988098

+1

これを行うには、 'using'文をpublicスコープに入れなければなりません。私は私の答えを更新しました。 –

-1

あなたは子供のblahとは異なるプロトタイプを持っています。親の場合はT blah()、子の場合はvoid blah(int)ですが、仮想関数の正確なオーバーロードを行うにはdouble blah()にする必要があります。

また、親の子テンプレート引数はありますか?