<div dir="ltr">坂本様<div><br></div><div>安藤です</div><div><br></div><div><div class="gmail_extra"><div>すみません、narrow しないとダメでした。</div><div><br></div><div>OpenRTM::ComponentObserver_var _provider = mgr_.getPOA()->id_to_<wbr>reference(oid_.in());<br></div><div>ではなく、</div><div>CORBA::Object_var obj = mgr_.getPOA()->id_to_<wbr>reference(oid_.in());<br></div>
OpenRTM::ComponentObserver_var _provider = OpenRTM::ComponentObserver::_narrow(obj);</div><div class="gmail_extra">のように、CORBA::Object 型から特定の方にnarrowが必要です。</div><div class="gmail_extra"><br></div><div class="gmail_extra">この辺のコードは ManagerServant.cpp などにも同じものがありますので参考にしてください。</div><div class="gmail_extra"><br></div><div class="gmail_extra"><br><div class="gmail_quote">2017年11月21日 2:30 Sakamoto Takeshi <span dir="ltr"><<a href="mailto:sakamoto@globalassist.co.jp" target="_blank">sakamoto@globalassist.co.jp</a>></span>:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">安藤 様<br>
<br>
<br>
いつもお世話になっております.<br>
グローバルアシストの坂本です.<br>
<br>
本当に何度も申し訳ございませんが,<br>
オブザーバの件につきまして,再度,お教えください.<br>
<br>
前回のアドバイスを基に,以下のような修正を行いました.<br>
<br>
> CORBAオブジェクトにする必要があるので、<wbr>スケルトンとServantBaseを継承する必要がありますね<wbr>。<br>
こちらのお話を基に,以下のように修正いたしました.<br>
<span class="gmail-">class ComponentObserverImpl<br>
 : public virtual PortableServer::ServantBase,<br>
  public virtual POA_OpenRTM::ComponentObserver {<br>
</span><span class="gmail-">public:<br>
 void update_status(::OpenRTM::<wbr>StatusKind status_kind, const char* hint);<br>
};<br>
<br>
</span><span class="gmail-">> servant_ = new ComponentObserverImpl();<br>
> RTM::Manager& mgr_ = RTM::Manager::instance();<br>
> CORBA::ObjectId_var oid_ = mgr_.getPOA()->servant_to_id(<wbr>servant_);<br>
> OpenRTM::ComponentObserver_var _provider = mgr_.getPOA()->id_to_<wbr>reference(oid_.in());<br>
> だいたいこんな感じです。<wbr>細かい文法は間違っているかもしれません。<br>
</span>こちらにつきましては,ほぼそのまま使わせて頂いたのですが,<br>
最後の行で以下のようなエラーが出てしまい,<wbr>コンパイルできませんでした.<br>
 'CORBA::Object_ptr' から<br>
 '_CORBA_ObjRef_Var<OpenRTM::_<wbr>objref_ComponentObserver,<wbr>OpenRTM::ComponentObserver_<wbr>Helper>' に<br>
 変換できません<br>
<br>
そこで,<br>
OpenRTM::ComponentObserver_var provider = OpenRTM::ComponentObserver::_<wbr>narrow(mgr_.getPOA()->id_to_<wbr>reference(<a href="http://oid.in" rel="noreferrer" target="_blank">oid.in</a>()));<br>
と無理矢理キャストをしてみたのですが,<wbr>こちらはコンパイルは通るようになったのですが,<br>
実行時エラーで落ちてしまいました.<br>
<br>
何度も申し訳ございませんが<br>
<span class="gmail-"> OpenRTM::ComponentObserver_var _provider = mgr_.getPOA()->id_to_<wbr>reference(oid_.in());<br>
</span>こちらの部分につきまして,再度,<wbr>アドバイスを頂ければ幸いです.<br>
<div class="gmail-HOEnZb"><div class="gmail-h5"><br>
よろしくお願いいたします.<br>
<br>
> 安藤です<br>
><br>
> グローバルアシストの坂本です.<br>
> ><br>
> > 何度も申し訳ございません.<br>
> > オブザーバの使用方法につきまして,再度,お教えください.<br>
> ><br>
> > 以前お教え頂きましたPytrhon版のサンプルで,<wbr>以下のような処理がございますが,<br>
> > こちらをC++で書こうと思った場合,<wbr>どのような記述となりますでしょうか?<br>
> > servant_ = ComponentObserver_i()<br>
> > mgr_ = OpenRTM_aist.Manager.instance(<wbr>)<br>
> > oid_ = mgr_.getPOA().servant_to_id(<wbr>servant_)<br>
> > self._provider = mgr_.getPOA().id_to_reference(<wbr>oid_)<br>
> ><br>
> ><br>
> servant_ = new ComponentObserverImpl();<br>
> RTM::Manager& mgr_ = RTM::Manager::instance();<br>
> CORBA::ObjectId_var oid_ = mgr_.getPOA()->servant_to_id(<wbr>servant_);<br>
> OpenRTM::ComponentObserver_var _provider = mgr_.getPOA()->id_to_<wbr>reference(<br>
> oid_.in());<br>
><br>
> だいたいこんな感じです。<wbr>細かい文法は間違っているかもしれません。<br>
><br>
><br>
> > また,ComponentObserver_iの定義として<br>
> > class ComponentObserver_i(OpenRTM__<wbr>POA.ComponentObserver):<br>
> > となっておりますが,そもそもC++の場合に,<br>
> > class ComponentObserverImpl : public OpenRTM::ComponentObserver<br>
> > という定義にすること自体が間違っているのでしょうか?<br>
> ><br>
><br>
> CORBAオブジェクトにする必要があるので、<wbr>スケルトンとServantBaseを継承する必要がありますね<wbr>。<br>
><br>
> class ComponentObserverImpl<br>
>  public virtual PortableServer::ServantBase,<br>
>  public virtual POA_OpenRTM::ComponentObserver<br>
> {};<br>
> RTObject.h 等を参考にしてみてください。<br>
><br>
<br>
-----------<br>
株式会社 グローバルアシスト<br>
坂本 武志<br>
<a href="mailto:sakamoto@globalassist.co.jp">sakamoto@globalassist.co.jp</a><br>
</div></div></blockquote></div><br></div></div></div>