[C++ Mapping] General question on using operator[] in sequence _var

This is a discussion on [C++ Mapping] General question on using operator[] in sequence _var within the Object forums in Theory and Concepts category; Hi, I have a problem compiling a client using TAO. But, before I ask TAO support, I raise the question as a general question on the C++ mapping, just to be sure I comply with the spec. IDL: module ServiceModule { typedef sequence<Object> SeqObj; interface Service { SeqObj list_objects(); }; }; C++: ServiceModule::Service_var service = [...] ServiceModule::SeqObj_var objList = service->list_objects(); CORBA::Object_ptr theObj = objList[0]; // assuming there is at least one element in the sequence The compiler (gcc) gives the following error on the line that uses operator[] for the sequence _var: Client.cpp:32: error: ISO C++ says that these are ...

Go Back   Application Development Forum > Theory and Concepts > Object

Object Mix

Register FAQ Calendar Search Today's Posts Mark Forums Read
  #1  
Old 10-21-2008, 04:51 AM
Jesse
Guest
 
Default [C++ Mapping] General question on using operator[] in sequence _var

Hi,

I have a problem compiling a client using TAO. But, before I ask TAO
support, I raise the question as a general question on the C++ mapping, just
to be sure I comply with the spec.

IDL:
module ServiceModule {

typedef sequence<Object> SeqObj;

interface Service {
SeqObj list_objects();
};
};

C++:
ServiceModule::Service_var service = [...]

ServiceModule::SeqObj_var objList = service->list_objects();

CORBA::Object_ptr theObj = objList[0]; // assuming there is at least one
element in the sequence


The compiler (gcc) gives the following error on the line that uses
operator[] for the sequence _var:
Client.cpp:32: error: ISO C++ says that these are ambiguous, even though the
worst conversion for the first is better than the worst conversion for the
second:
/oasis-project/pdeparis/tao-1.5a/ACE_wrappers/build/Linux-2.6EL5/TAO/tao/Seq_Var_T.inl:208:
note: candidate 1: typename TAO_VarSeq_Var_T<T>::T_elem
TAO_VarSeq_Var_T<T>:perator[](CORBA::ULong) [with T =
ServiceModule::SeqObj]
Client.cpp:32: note: candidate 2: operator[](ServiceModule::SeqObj*, int)
<built-in>

I have had this error since quite a while now, through various major
versions of TAO (even Orbix 3 !), and got used to the work around:

CORBA::Object_ptr theObj = (*objList)[0];

However, I would like to be sure that this operator[] for sequence _var is a
a reality (included in the spec) and the way I use it is compliant.

Cheers,

JC.

PS: I cross-post on comp.soft-sys.ace since the activity on
comp.object.corba is very low (as an euphemism ;-)


Reply With Quote
  #2  
Old 10-22-2008, 12:51 PM
Jon Biggar
Guest
 
Default Re: [C++ Mapping] General question on using operator[] in sequence_var

Jesse wrote:
> CORBA::Object_ptr theObj = objList[0]; // assuming there is at least one
> element in the sequence
>
>
> The compiler (gcc) gives the following error on the line that uses
> operator[] for the sequence _var:
> Client.cpp:32: error: ISO C++ says that these are ambiguous, even though the
> worst conversion for the first is better than the worst conversion for the
> second:
> /oasis-project/pdeparis/tao-1.5a/ACE_wrappers/build/Linux-2.6EL5/TAO/tao/Seq_Var_T.inl:208:
> note: candidate 1: typename TAO_VarSeq_Var_T<T>::T_elem
> TAO_VarSeq_Var_T<T>:perator[](CORBA::ULong) [with T =
> ServiceModule::SeqObj]
> Client.cpp:32: note: candidate 2: operator[](ServiceModule::SeqObj*, int)
> <built-in>
>
> I have had this error since quite a while now, through various major
> versions of TAO (even Orbix 3 !), and got used to the work around:
>
> CORBA::Object_ptr theObj = (*objList)[0];
>
> However, I would like to be sure that this operator[] for sequence _var is a
> a reality (included in the spec) and the way I use it is compliant.


That's an unfortunate side effect of the C++ overload resolution
mechanimsm. The problem is that '0' is an int, not a CORBA::ULong, so
there's two possible conversion paths:

A1. Convert 0 to CORBA::ULong
A2. call ServiceModule::SeqObj_var:perator[]()

and

B1. Convert ServiceModule::SeqObj_var to ServiceModule::SeqObj *&
B2. Convert 0 to CORBA::ULong
B3. call builtin operator[](ServiceModule::SeqObj *, int)

There's no way to make the compiler prefer the first one by the C++
rules, and conversion B1 is needed when passing a _var as an inout
parameter. This only happens when you use an integer constant as a
subscript.

Another workaround is this:

CORBA::Object_ptr theObj = objList[CORBA::ULong(0)];

or if you know CORBA::ULong is the same type as unsigned long:

CORBA::Object_ptr theObj = objList[0UL];


--
Jon Biggar
jon@biggar.org
jon@floorboard.com
Reply With Quote
Reply


Thread Tools
Display Modes


All times are GMT -5. The time now is 06:14 AM.


Powered by vBulletin® Version 3.7.2
Copyright ©2000 - 2009, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
vB Ad Management by =RedTyger=

In an effort to better serve ads to our visitors, cookies are used on objectmix.com. For more information, check out our Privacy Policy.