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

Re: OT: C++ help



On 21/05/2008, Mike Bird <mgb-debian@yosemite.net> wrote:
> On Wed May 21 2008 20:01:10 Jordi Gutiérrez Hermoso wrote:
>
>  > So what's the fix here? Why does a using A::f declaration inside class
>  > B not work?
>
>
> There's no f(int) in scope, only int(foo).

No, no, wait. This makes no sense. Consider

     class foo{};

     class A{
     public:
       void f(int a ){a++;};
     private:
       virtual void f(foo a) = 0;
     };

     class B : public A{
     public:
       using A::f;
     private:
       virtual void f(foo a){};
     };

     int main(){
       B b;
       int a=0;
       b.f(a);
     }

versus

     class foo{};

     class A{
     public:
       void f(int a ){a++;};
     public:
       virtual void f(foo a) = 0;
     };

     class B : public A{
     public:
       using A::f;
     public:
       virtual void f(foo a){};
     };

     int main(){
       B b;
       int a=0;
       b.f(a);
     }

The *only* thing that changed is the access specifiers. For some
reason, the name lookup works and it seems that the compiler
understands that "using A::f" means "A::f(int)" when some function is
public but fails when the function is private, and tries instead to
interpret "using A::f" as "A::f(C)". The first example fails to
compile, but the second one does.

>  But the best solution is to read up on WHY C++ works this way so
>  you can understand the implications that thousands of great minds
>  have already pondered.

Well, those great minds seem to be too great for me to fathom, because
I really don't see why it seems here that a function's signature isn't
enough to specify it, and they saw it fit to make sure I couldn't both
I overload and inherit three related but different functions.

C++ isn't perfect, the standard isn't gospel, and I'm beginning to
suspect a bug in gcc.

- Jordi G. H.


Reply to: