2

これは、エラーが発生する行です。

this->_tbfCmdHandler.reset(new Bar()); 

Facade_impl.cpp(202): エラー C2259: 'FOO::Bar':
次のメンバーのために抽象クラスをインスタンス化できません:
'void Subscriber::update(T)':
T=char & で抽象化されています

observer.h(66) : T=char & 'void Subscriber::update(T)'を
使用した'Subscriber::update' の宣言を参照してください : T=const char &を使用した抽象です

observer.h(66) : T=const char &
を使用した'Subscriber::update' の宣言を参照してください]

これは Facade::Implementation の宣言です

namespace FOO
{
class Facade::Implementation 
                :public Subscriber<const char& >                     
{

ファサード.cpp

FOO::Facade::Facade () : impl (new Implementation)
{

    Singleton<SPM::Facade>::instance ();
}


The update functions:
    void update( const char *aMsg)   
    {
        printf("foo");
    }; 

これが、どこでエラーを見つけることができるかを理解するのに役立つことを願っています.

4

6 に答える 6

3

あなたはすでにあなたの答えを書いています。クラスは抽象的です。つまり、純粋な仮想メソッドがあります。したがって、最初にこれらのメソッドを実装する必要があります。

于 2010-01-11T10:13:07.470 に答える
2

ポリモーフィズムと抽象クラスとは何かについて読んでください。

抽象とは、まだ完全に定義されていないことを意味します。したがって、すべての部分を把握していないため、それをインスタンス化することはできません。

それは、エンゲージなしで車を始動しようとするようなものです。

于 2010-01-11T10:14:37.883 に答える
2

このC++ FAQを読んでみてください

于 2010-01-11T10:14:40.600 に答える
2

抽象クラスから継承しているため、クラスFacade ::Implementation内にvoidupdate(const char&)関数を実装する必要があります。

更新関数を定義しましたが、サブスクライバーとはまったく関係ありません。あなたはそれをあなたの実装の中に入れなければなりません。

于 2010-01-11T16:04:59.243 に答える
1

これが問題の解決策です。

void update(const char&aMsg)を削除したところ、別の「void update(char * aMsg)」があることがわかりました。

この関数がコンパイラによって報告されなかった理由は奇跡です...non-constとPointer(参照の代わりに)関数を削除すると、問題が最終的に修正されます。

于 2010-01-11T16:07:03.577 に答える
0

エラーはvoid Subscriber<T>::update(T)' : is abstractで言うので、だけでなく、T=char &を定義する必要があります。void update(char&)void update( const RecoveryState &dummy){}

于 2010-01-11T10:20:37.623 に答える