FIX: Same Name for Function and Class Causes C2079

ID: Q167356


The information in this article applies to:
  • Microsoft Visual C++, 32-bit Editions, version 5.0


SYMPTOMS

If a single name refers to both a class name and a function name, errors similar to the following may be incorrectly generated:

error C2079: 'g1' uses undefined struct 'g' error C2875: using-declaration causes a multiple declaration of 'A::x' error C2513: 'struct B::x' : decl-specifier is missing a declarator before '='


RESOLUTION

Replace the using declaration with a using directive. For example, in the following code replace the using declarations:


   using B::f
   using B::g
   using B::x 
with one:

using namespace B; 
Please see the MORE INFORMATION section for a sample that demonstrates the workaround.


STATUS

Microsoft has confirmed this to be a problem in the Microsoft products listed at the beginning of this article.This problem was corrected in Microsoft Visual C++ version 6.0.


MORE INFORMATION

Section 7.3.3, paragraphs 4 thru 15 of the C++ Final Draft International Specification discuss this language behaviour in detail:

If the set of declarations and using-declarations for a single name are given in a declarative region, --they shall all refer to the same, or all refer to functions; or --exactly one declaration shall declare a class name or enumeration name and the other declarations shall all refer to the same entity or all refer to functions; in this case the class name or enumeration name is hidden.

Sample Code


    namespace A {
       int x;
    }
    namespace B {
       int i;
       struct g { };
       struct x { };
       void f(int);
       void f(double);
       void g(char);
    }
    void func()  {
       int i;
       void f(char);
       using B::f;
       f(3.5f);
       using B::g;
       g('a');
       struct g g1;     // error C2079
       using B::x;
       using A::x;     // error C2875
       x = 99;         // error C2513:
       struct x x1;
    }

    //Workaround
    namespace A {
       int x;
    }
    namespace B {
       int i;
       struct g { };
       struct x { };
       void f(int);
       void f(double);
       void g(char);
    }

    void func()  {
       using namespace B ;
       int i;
       void f(char);
       f(3.5f);
       g('a');
       struct g g1;
       using A::x;
       x = 99;
       struct x x1;
    } 

Additional query words:

Keywords : kbtool kbVC500bug kbVC600fix
Version : winnt:5.0
Platform : winnt
Issue type : kbbug


Last Reviewed: March 27, 1999
© 2000 Microsoft Corporation. All rights reserved. Terms of Use.