2011-07-25 5 views
3

私は以下のことがあり、エラーを解決することができない場合は助けてください。C++ - スマートポインタ - テンプレートを介してベースクラスへの共有クラスのポインタを渡す

私はどこかのテンプレート定義として次のクラスを持っています。

template<class ConcreteHandlerType> 
class SomeAcceptor: public ACE_Acceptor<ConcreteHandlerType, ACE_SOCK_Acceptor> 

は、いくつかの他のファイルでは、私はコンストラクタでこのクラスを初期化

class initialize { 

    typedef SomeAcceptor<BaseClassSomeHandler> baseAcceptor_t; 
    typedef SomeAcceptor<DerivedClassSomeHandler> derivedAcceptor_t; 
    boost::shared_ptr<baseAcceptor_t;> mAcceptor; 
    boost::shared_ptr<derivedAcceptor_t;> mDerivedAcceptor; 

    bool HandleAcceptNotification(BaseClassSomeHandler& someHandler); 

    initialize() : mAcceptor(0), mDerivedAcceptor(new DerivedAcceptor_t) { 
     mAcceptor->SetAcceptNotificationDelegate(fastdelegate::MakeDelegate(this, &initialize::HandleAcceptNotification)); 
    } 
} 

私が手にエラーが発生しました(

error: no matching function for call to `boost::shared_ptr<SomeAcceptor<BaseClassSomeHandler> >::shared_ptr(int)'common/lib/boost_1_39_0/boost/smart_ptr/shared_ptr.hpp:160: note: candidates are: boost::shared_ptr<SomeAcceptor<BaseClassSomeHandler> >::shared_ptr(const boost::shared_ptr<SomeAcceptor<BaseClassSomeHandler> >&) 
common/lib/boost_1_39_0/boost/smart_ptr/shared_ptr.hpp:173: notboost::shared_ptr<T>::shared_ptr() [with T = SomeAcceptor<BaseClassSomeHandler>] 

は私も ブールHandleAcceptNotificationを持つ関数のオーバーロードを試してみましたDerivedClassSomeHandler &ですsomeHandler);

ですが、mAcceptorはSomeAcceptor BaseClassSomeHandlerタイプなので、このエラーは発生しますが、これを修正します。

私は何とかそれをキャストする必要がありますが、それを行う方法は?あなたはmAcceptorがNULL(0)、その場合は、あなたドン割り当てることにしたいよう

iは、コンストラクタ内で以下のようにやってみました、それはあなたのコードから

initialize() : mAcceptor(0), mDerivedAcceptor(new DerivedAcceptor_t) { 

     mAcceptor = mDerivedAcceptor; // Error here 

     mAcceptor->SetAcceptNotificationDelegate(fastdelegate::MakeDelegate(this, &initialize::HandleAcceptNotification)); 
    } 

答えて

1

を動作しませんでした、それが見えますそれを初期化する必要はありません。デフォルトのコンストラクタがそれを処理します。しかし、その(NULL)ポインタ上の関数をすぐに呼び出すので、あなたは何をしたいのかを直ちに明らかにしません。

あなたはmAcceptormDerivedAcceptorが同じ(共有)オブジェクトとDerivedClassSomeHandlerBaseClassSomeHandlerから派生し仮定を指すようにしたい場合は、これはhereが説明するように、boost::shared_static_castを使用すべき状況です。

this apparently related questionにもいくつかの良い情報があります。

0

エラーがsmart_ptr既定のコンストラクタは、NULLにptrを包んだので、初期化リストからmAcceptor(0)を除外を割り当てによるmAcceptor(0)

initialize() : mAcceptor(0), mDerivedAcceptor(new DerivedAcceptor_t) { 
    mAcceptor->SetAcceptNotificationDelegate(fastdelegate::MakeDelegate(this, &initialize::HandleAcceptNotification)); 
} 

です。

0

boost::shared_ptr<SomeAcceptor<BaseClassSomeHandler> >::shared_ptr(int)

int型受け入れるコンストラクタがないことをあなたに叫びました。

だけ使用します。mAcceptor()

関連する問題