Re: Function overloading

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

 



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