RE: Function overloading

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



That does not make sense to me, in the original example the function is
not what I would call 'overloaded', as I understand  a function in a
derived class is not in the same scope as a function in a base class, so
a function with the same name _hides_ the function from the base class
rather than overloading it, resulting in the behaviour observed by the
original poster.
 
I don't see how the prohibition of overloading a static function with
the same parameter types applies to hiding a function with _different_
parameter types? 


Happy to be corrected if I'm wrong,

Robert



> -----Original Message-----
> From: gcc-help-owner@xxxxxxxxxxx 
> [mailto:gcc-help-owner@xxxxxxxxxxx] On Behalf Of Wesley Smith
> Sent: 21 March 2007 07:26
> To: gcc-help@xxxxxxxxxxx
> Subject: Re: Function overloading
> 
> Wow that really clarifies things.  Is there an URL for this 
> documentation?
> Many thanks,
> wes
> 
> On 3/21/07, Vadim Doroginin <archimed7592@xxxxxxxxx> wrote:
> > On 3/21/07, Wesley Smith <wesley.hoke@xxxxxxxxx> wrote:
> > > I have a question about function overloading.  I'm getting alot of
> > > errors when I do the following
> > >
> > > class A
> > > {
> > >     void draw();
> > > };
> > >
> > >
> > > class B : public A
> > > {
> > >      static int draw(lua_State *L);
> > >      static B * get(lua_State *L, int i);
> > > }
> > >
> > > //bad
> > > int B :: draw(lua_State *L)
> > > {
> > >       B *b = get(L, 1);
> > >       b->draw()   //<--- produces error because it things 
> I'm calling
> > > the static B function
> > > }
> > >
> > >
> > > //good
> > > int B :: draw(lua_State *L)
> > > {
> > >       B *b = get(L, 1);
> > >       b->A::draw()   //<--- no errors
> > > }
> > >
> > >
> > >
> > > Shouldn't the compiler understand that I'm actually calling the
> > > superclass' draw method, especially since the class' draw 
> method is
> > > static and I'm calling it as an instance method?
> > >
> > > thanks,
> > > wes
> > >
> >
> > No.
> > IS 13.1 says:
> > Certain function declarations cannot be overloaded:
> > - Function declarations that differ only in the return type 
> cannot be
> > overloaded.
> > - Member function declarations with the same name and the same
> > parameter types cannot be overloaded if any of them is a 
> static member
> > function declaration (9.4). Likewise, member function template
> > declarations with the same name, the same parameter types, and the
> > same template parameter lists cannot be overloaded if any 
> of them is a
> > static member function template declaration. The types of 
> the implicit
> > object parameters constructed for the member functions for 
> the purpose
> > of overload resolution (13.3.1) are not considered when comparing
> > parameter types for enforcement of this rule. In contrast, 
> if there is
> > no static member function declaration among a set of member function
> > declarations with the same name and the same parameter types, then
> > these member function declarations can be overloaded if 
> they differ in
> > the type of their implicit object parameter. [Example: the following
> > illustrates this distinction:
> > class X {
> >         static void f();
> >         void f(); // ill-formed
> >         void f() const; // ill-formed
> >         void f() const volatile; // ill-formed
> >         void g();
> >         void g() const; // OK: no static g
> >         void g() const volatile; // OK: no static g
> > };
> > -end example]
> >
> 


[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux