2016-12-09 28 views
3

私はC++テンプレートを使用していますが、上記のエラーが発生しました。C++は変数を抽象型に宣言できません

#include <iostream> 
#include <string> 
using namespace std; 
enum type{ONE,TWO,THREE,FOUR,FIVE}; 

class base{ 
public: 
    virtual void baseOut()const =0; 
}; 
template<class T> 
class derived:public base{ 
    virtual void drivedOut()const=0; 
}; 

template<class T,type> 
class derived2:public derived<T>{ 
    public: 
    void baseOut(){} 
    void drivedOut(){} 

}; 

int main(){ 
    derived2<string,ONE> d; 
    return 0; 
} 

私の質問は、私はクラステンプレートdrived2に、純粋仮想関数をオーバーライドしておりますので、なぜdrived2はまだ抽象クラスであるということである:次のように

私のコードはありますか?どうすればこのエラーを取り除くことができますか?

ありがとうございました:)

+0

トピックオフ:「派生」と呼ばれ、「駆逐」されていません –

+0

いただきありがとうございます。私はそれを変更しました:) – Casualet

答えて

14

derived2::baseOutが非constあるので、あなたは、base::baseOutをオーバーライドしていません!

void baseOut() const { } 
//    ^^^^^ 

derived2::derivedOutについても同様である。

これらのエラーをキャッチするには、overrideを使用してください。

void baseOut() override { }  // Error, overrides nothing! 
void baseOut() const override { } // OK 

クランはこの1つ上のGCCよりも便利です:関数ALSPの

main.cpp:18:14: warning: 'derived2<std::__cxx11::basic_string<char>, type::ONE>::baseOut' 
       hides overloaded virtual function [-Woverloaded-virtual] 
     void baseOut(){} 
      ^

[...] 

main.cpp:8:22: note: hidden overloaded virtual function 'base::baseOut' declared here: 
       different qualifiers (const vs none) 
     virtual void baseOut()const =0; 
        ^
0

オーバーロードは、その関数のconst性に依存します。 Const機能

void baseOut(){} - - 非const機能

はあなたのコード

virtual void baseOut()const =0;

http://www.geeksforgeeks.org/function-overloading-and-const-functions/を参照してください。

したがって、関数のオーバーライド(期待している)ではなく関数のオーバーロードです。 2つの仮想関数に対して関数定義が存在しないため、derived2も抽象クラスになります。

+0

'baseOut'はオーバーロードされていませんが、隠されています。抽象クラスになっていなくても 'const'バージョンは、' using'でオーバーロードセットに追加するまで、派生クラスには表示されません。 – Quentin

関連する問題