[C++-sig] Re: Boost.Python not resolving overloads

David Abrahams dave at boost-consulting.com
Sun Sep 21 04:10:37 CEST 2003


"Niall Douglas" <s_sourceforge at nedprod.com> writes:

> On 20 Sep 2003 at 21:46, David Abrahams wrote:
>
>> >>>> from TnFOX import *
>> >>>> fh=FXFile("fred.txt")
>> >>>> print fh.name()
>> > Traceback (most recent call last):
>> >   File "<stdin>", line 1, in ?
>> > Boost.Python.ArgumentError: Python argument types in
>> >     FXFile.name()
>> > did not match C++ signature:
>> >     name(class FX::FXString)
>> >     name(class FX::FXFile {lvalue})
>> >>>> print fh.name(fh)
>> > fred.txt
>> >
>> > As it says, there are two name()'s defined. 
>> 
>> Clearly it's a static method which takes a single argument.  if you
>> want to call it as fh.name() you can't make it static (or you need an
>> overload which takes no arguments).
>
> Yes sorry - it's 3am here. One of the name()'s is static but the 
> other one isn't:
>
> class FXFile
> {
>    const FXString &name() const;
>    static FXString name(const FXString &file);
> };

There's no such thing as that in Python.  Overloading is somewhat of
a simulation too.  Any given name can only be static or non-static.

> Now in my example above, I was calling name(void), not name(file). If 
> you call name(fh) then it correctly calls the name(void).
>
>> > I tried a number of other 
>> > functions with no parameters and all of them cause an error if there
>> > are overloads present. The only way to make them work is to include
>> > the instance as the first parameter.
>> >
>> > Is this right? It's counter-intuitive and inconvenient - surely
>> > boost.python can try inserting the instance if no parameters are
>> > present?
>> 
>> Wha???  No, it can't just guess at what you mean.  
>
> I don't see why. If one of my name()'s is zero parameters and the 
> other one takes a string

Neither is zero parameters, as the error indicates.  One takes an
FXString and the other takes an FXFile.

> , and I call name(), then it's obvious I want 
> the zero parameter one.
>
> Besides, the error message is from Boost.Python, not Python.

Boost.Python uses the Python staticmethod wrapper to create static
methods.

> If this is not known behaviour, I'll make you a demo though it would 
> be trivial for you to write yourself.

a demo from you is always less trivial than making it myself.
In this case, though, the behavior is known and expected.

-- 
Dave Abrahams
Boost Consulting
www.boost-consulting.com





More information about the Cplusplus-sig mailing list