Re: Bool/int confusion (109 Views)
Reply
Occasional Visitor
Josh Winkler
Posts: 3
Registered: ‎09-24-2009
Message 1 of 5 (109 Views)

Bool/int confusion

It's admittedly been a long time since I've done any real work in C++, and this has been killing me for a few days now. We are migrating to an Itanium server, and I'm getting this compiler error:

"collector.C", line 41: error #2418: more than one conversion function from
"mmm::predicate" to a built-in type applies:
function "mmm::predicate::operator bool() [with T=int]"
function "mmm::predicate::operator T &() [with T=int]"

The actual (relevant) code is:
template
class predicate {
public:
virtual operator bool();
T &operator=(T v);
operator T&();
.........

Finally, the entire, overly verbose compile statement (I love makefiles):
Compiling collector.C
/opt/aCC/bin/aCC -g0 -AP -v -w +z +Z +Maked +DD32 -DNOWHAT -I. -I/opt/siadev/jwinkle/SIA/DASC/include -I/opt/siadev/jwinkle/SIA/include_r -I/opt/EA2000_3.5.1.4/include -I. -I/opt/siadev/jwinkle/SIA/DASC/adapter/include -I/opt/siadev/jwinkle/SIA/DASC/common/include -I/opt/siadev/jwinkle/SIA/DASC/adapter/include -I/opt/siadev/jwinkle/SIA/include -I/opt/siadev/jwinkle/SIA/DASC/SAQ/external/include -I/opt/tuxdir/tuxedo8.1/include -I/opt/topcom/5.6/build/inc -I/usr/include -c collector.C
/opt/aCC/lbin/ecom -architecture 32 -makedepend file -ia64abi all -diag off -inst compiletime -sysdir /usr/include -inline_power 1 -link_type dynamic -fpeval float -fpevaldec _Decimal32 -tls_dyn on -target_os 11.23 -I. -I/opt/siadev/jwinkle/SIA/DASC/include -I/opt/siadev/jwinkle/SIA/include_r -I/opt/EA2000_3.5.1.4/include -I. -I/opt/siadev/jwinkle/SIA/DASC/adapter/include -I/opt/siadev/jwinkle/SIA/DASC/common/include -I/opt/siadev/jwinkle/SIA/DASC/adapter/include -I/opt/siadev/jwinkle/SIA/include -I/opt/siadev/jwinkle/SIA/DASC/SAQ/external/include -I/opt/tuxdir/tuxedo8.1/include -I/opt/topcom/5.6/build/inc -I/usr/include --sys_include /opt/aCC/include --sys_include /opt/aCC/include/iostream --sys_include /usr/include --sys_include /usr -D_HP_IA64ABI -D_BIND_LIBCALLS -D_Math_errhandling=MATH_ERREXCEPT -D__hpux -D__unix -D__ia64=1 -D__ia64__=1 -D_BIG_ENDIAN=1 -D__STDCPP__ -D_ILP32 -D__cplusplus=199711L -D__HP_aCC=62000 -D_HP_INSTANTIATE_T_IN_LIB -D_INLINE_ASM -D_FLT_EVAL_METHOD=0 -D_DEC_EVAL_METHOD=0 -DNOWHAT -debug debugG -ucode hdriver=optlevel%1% -plusolistoption -Ol06all! -plusolistoption -Ol13moderate! -plusooption -Oq01,al,ag,cn,sz,ic,vo,Mf,Po,es,rs,Rf,Pr,sp,in,cl,om,vc,pi,fa,pe,rr,pa,pv,nf,cp,lx,Pg,ug,lu,lb,uj,dn,sg,pt,kt,em,np,ar,rp,dl,fs,bp,wp,pc,mp,lr,cx,cr,pi,so,Rc,fa,ft,fe,ap,st,lc,Bl,sr,Qs,do,ib,pl,sd,ll,rl,dl,Lt,ol,fl,lm,ts,rd,dp,If! collector.C


WHY, oh why, does this think my bool is an int? I saw another post recently about this, and I am 100% certain that nowhere in our code is a bool being typedef, or #define'd, as an int.
Acclaimed Contributor
Dennis Handly
Posts: 25,291
Registered: ‎03-06-2006
Message 2 of 5 (109 Views)

Re: Bool/int confusion

>CC -g0 -AP -v -w +z +Z -I/usr/include

Why are you using -AP? You should use the default -AA.

Instead of using -w, you should suppress individual warnings with +Wnnnn.
You should also not specify the default include file paths.

>The actual (relevant) code is:

Where is the code that is using/calling this template?

You may have to use a cast hammer and tell the compiler exactly which function you want to call

>does this think my bool is an int?

Why do you think that? It is trying to convert a something?, mmm::predicate, either to a bool or an int&.

I can duplicate the message with:
error #2418: more than one conversion function from "predicate" to a built-in type applies:
function "predicate::operator bool() [with T=int]"
function "predicate::operator T &() [with T=int]"
int i = 8 + P;

aCC3 doesn't seem to give an error.

Adding a hammer makes it work:
int i = 8 + (bool)P;
int i = 8 + static_cast(P);
Occasional Visitor
Josh Winkler
Posts: 3
Registered: ‎09-24-2009
Message 3 of 5 (109 Views)

Re: Bool/int confusion

>Why are you using -AP? You should use the default -AA.

Instead of using -w, you should suppress individual warnings with +Wnnnn.
You should also not specify the default include file paths.


I took out the default include paths, FWIW. We are using -AP and -w becuase we are migrating over 200MB of code, and are essentially doing so in stages. Once it builds without errors, we'll worry about warnings.

>Where is the code that is using/calling this template?


mmm::predicate alarm;

......

"collector.C", line 154: error #2418: more than one conversion function from
"mmm::predicate" to a built-in type applies:
function "mmm::predicate::operator bool() [with T=int]"
function "mmm::predicate::operator T &() [with T=int]"
while (SIGTERM != alarm) {
^

>Why do you think that? It is trying to convert a something?, mmm::predicate, either to a bool or an int&.

My understanding is, SIGTERM is an int, and alarm is predicate, so it should be using the predicate::operator T &() functions. Confusing int and bool is the only reason I can think of for why it would be looking to predicate::operator bool() as well.

While doing a cast would work, this is used in a bunch of places, and I don't really want to make 100 edits, when hopefully 1 fix would suffice.

I'd be more than happy to be told my understandings are wrong here. I've been living in C# and scripting languages for the last 8 or 9 years, so my C++ is still a bit fuzzy.
Occasional Visitor
Josh Winkler
Posts: 3
Registered: ‎09-24-2009
Message 4 of 5 (109 Views)

Re: Bool/int confusion

Acclaimed Contributor
Dennis Handly
Posts: 25,291
Registered: ‎03-06-2006
Message 5 of 5 (109 Views)

Re: Bool/int confusion

>SIGTERM is an int, and alarm is predicate, so it should be using the predicate::operator T &() functions. Confusing int and bool is the only reason I can think of for why it would be looking to predicate::operator bool() as well.

The Standard says both int and bool have equal precedence in operator overloading.

>when hopefully 1 fix would suffice.

Remove the operator bool but it must be important since it is virtual.

>Found my answer here:

Right: "these conversion functions may interfere with perfectly valid conversions and overloads."

The opinions expressed above are the personal opinions of the authors, not of HP. By using this site, you accept the Terms of Use and Rules of Participation.