[openrtm-users 00498] 質問:サービスポートのIDLにおいて、複数のIDL間で、共通に利用する型を参照する方法
小田 謙太郎 / Kentaro Oda
oda @ ci.kyutech.ac.jp
2008年 7月 1日 (火) 17:10:29 JST
皆様
九州工業大学 小田と申します。
Open-RTM 0.4.2 C++、Ubuntu 7、omniORB 4.0.7にて開
発を行っています。
そこで質問なのですが、サービスポートのIDL定義において、複数の
IDL間で、共通に利用する型を参照する方法を知りたくメールしてお
ります。
例えば、デザインパターンでいうSubject-Observerパターン
において、Subjectの更新にともなって、複数のObserver
に更新の通知を行うような
コンポーネントSubjectObserverEngineを実装することを想定
します。(最後に具体的なrtc-templateコマンドを挙げています)
そこで、
監視の対象:Subject型、
Subjectの通知の対象:Observer型、
通知を行う主体:Notifier型
として宣言します。
このとき、Observer型とNotifier型は、メソッドの引数に
Subjectが必要なので、共にSubject型の宣言を必要とします
が、これを素直を行う方法が分からなくて困っています。
より詳細には、
--- Subject.idl定義 ---
interface Subject {
void foo();
};
--- Observer.idl定義 ---
/* includeによる方法
#include "Subject.idl"
*/
/* 埋め込みによる方法
interface Subject {
void foo();
};
*/
interface Observer {
void listenUpdate(in Subject aSubject);
};
--- Notifier.idl定義 ---
/* includeによる方法
#include "Subject.idl"
*/
/* 埋め込みによる方法
interface Subject {
void foo();
};
*/
interface Notifier {
void notifyUpdate(in Subject aSubject);
};
NotifierとObserverの宣言にて、Subject型を利用する
には、Subject.idlをincludeによって取り込む方法
と、Subject型の宣言を
埋め込む方法があると思いますが、これらの両方においてエラーが
発生してしまいます。
・includeによる方法を用いた場合のエラー:
******** 途中省略 ******
g++ `rtm-config --cflags` -I. -c -o SubjectObserverEngine.o
SubjectObserverEngine.cpp
NotifierSkel.h:31 から include されたファイル中,
NotifierSVC_impl.h:8 から,
SubjectObserverEngine.h:19 から,
SubjectObserverEngine.cpp:7 から:
Notifier.hh:24:22: error: Subject.hh: No such file or directory
Notifier.hh:120: error: ‘Subject_ptr’ has not been
declared
Notifier.hh:154: error: ‘Subject_ptr’ has not been
declared
NotifierSVC_impl.h:32: error: ‘Subject_ptr’ has not been
declared
Observer.hh:120: error: ‘Subject_ptr’ has not been
declared
Observer.hh:154: error: ‘Subject_ptr’ has not been
declared
make[1]: *** [SubjectObserverEngine.o] エラー 1
make[1]: ディレクトリ `/home/oda/opentest' から出ます
make: *** [all] エラー 2
・埋め込みによる方法を用いた場合のエラー:
******** 途中省略 ******
g++ `rtm-config --cflags` -I. -c -o SubjectObserverEngine.o
SubjectObserverEngine.cpp
Observer.hh:85: error: redefinition of ‘class Subject’
Notifier.hh:85: error: previous definition of ‘class
Subject’
Observer.hh:112: error: redefinition of ‘class
_objref_Subject’
Notifier.hh:114: error: previous definition of ‘class
_objref_Subject’
Observer.hh:135: error: redefinition of ‘class
_pof_Subject’
Notifier.hh:135: error: previous definition of ‘class
_pof_Subject’
Observer.hh:144: error: redefinition of ‘class
_impl_Subject’
Notifier.hh:146: error: previous definition of ‘class
_impl_Subject’
Observer.hh:270: error: redefinition of ‘class
POA_Subject’
Notifier.hh:273: error: previous definition of ‘class
POA_Subject’
Observer.hh:312: error: redefinition of ‘static void
Subject::_marshalObjRef(_objref_Subject*, cdrStream&)’
Notifier.hh:312: error: ‘static void
Subject::_marshalObjRef(_objref_Subject*, cdrStream&)’
previously defined here
make[1]: *** [SubjectObserverEngine.o] エラー 1
make[1]: ディレクトリ `/home/oda/opentest' から出ます
make: *** [all] エラー 2
そもそも、rtc-templateのhelpによると、
" --consumer-idl=[IDL filename]:
Specify IDL file of service consumer.
For simplicity, please define one interface in one IDL file,
although
this IDL file can include two or more interface definition,"
となっており、1IDLにinterface定義を1つのみにするこ
とは理解できます。
しかしこれは、他のインターフェース型を参照することも防ぐもの
でしょうか?
利用したRTCテンプレート:
rtc-template -bcxx \
--module-name=SubjectObserverEngine --module-
type='DataFlowComponent' \
--module-desc='Subject Observer Engine test' \
--module-version=1.0 --module-vendor='Kyushu Institute of
Technology' \
--module-category=Consumer \
--module-comp-type=DataFlowComponent --module-act-
type=SPORADIC \
--module-max-inst=1 \
--service=Notifier:notifier:Notifier \
--service-idl=Notifier.idl \
--service-idl=Subject.idl \
--consumer=Observer:observer0:Observer \
--consumer=Observer:observer1:Observer \
--consumer=Observer:observer2:Observer \
--consumer-idl=Observer.idl
小さいので(約700bytes)これらのファイルのセットを
添付しておきます:
-------------- next part --------------
テキスト形式以外の添付ファイルを保管しました...
ファイル名: SubjectObserver.tar.gz
型: application/x-gzip
サイズ: 682 バイト
説明: 無し
URL: <http://www.openrtm.org/pipermail/openrtm-users/attachments/20080701/8f9901cb/attachment-0001.bin>
openrtm-users メーリングリストの案内