RE:CINT and overload resolution

From: Masaharu Goto (MXJ02154@nifty.ne.jp)
Date: Wed Mar 15 2000 - 22:36:46 MET


Hello George,

Cint checks parameter matches from exact match to user conversion
all together with all the arguments. In this case,
    TPhCalKey("String","String",100)
Cint searches in following order
    TPhCalKey(char*,char*,int)
    template<class T,E> TPhCalKey(T,T,E)
    TPhCalKey(char*,char*,(any integral type))
    TPhCalKey(void*,void*,(any numerical type))
    TPhCalKey(anyUserConv(char*),anyUserConv(char*),anyUserConv(int))

In this case, because all 3 parameters matched with user defined conversion
before it sees the true candidate.  This behavior is not fully compliant to
the standard , but speeds up overloading resolution in interpreter 
environment. Please understand the speed advantage and stand with current
implementation.

About explicit keyword, cint supports it only with interpreted functions.
I made a change so that this feature is also used for precompiled functions.
>From 5.14.34, you can use explicit keyword to avoid this kind of problem.

Thank you
Masaharu Goto



>
>Rooters,
>
>I just ran into this problem again:
>
>I have an object with two constructors. One takes 
>TPhCalKey(const TString &, const TString &, TDatime)
>
>and the other takes:
>TPhCalKey(const TString &, const TString &, Int)
>
>If in CINT, I try to call this function with
>
>TPhCalKey("String","String2",100)
>
>it calls the first constructor, implicitly making a TDatime from an 
>Int.
>
>All compilers I have used report no ambiguity and resolve to the second 
>function.
>
>I realize that I can kludge around this by fixing the order of 
>declaration of the constructors, but I think this really ought to be 
>fixed in CINT. I know it's not a perfect ANSI interpreter, but proper 
>intuitive overload resolution is something that people expect to just 
>work, and when it doesn't, it can cause subtle, hard-to-find and 
>hard-to-fix bugs.
>
>I also think that, at least on compilers conforming to the standard and 
>having the 'explicit' keyword, the TDatime constructor from an Int 
>ought to be declared as 'explicit'. Does CINT understand the explicit 
>keyword? If it did, this would also have fixed my particular problem...
>
>George Heintzelman
>gah@bnl.gov
>



This archive was generated by hypermail 2b29 : Tue Jan 02 2001 - 11:50:21 MET