FIX: Same Name for Function and Class Causes C2079 (167356)



The information in this article applies to:

  • Microsoft Visual C++, 32-bit Enterprise Edition 5.0
  • Microsoft Visual C++, 32-bit Professional Edition 5.0

This article was previously published under Q167356

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 that this is a problem in the Microsoft products that are 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;
    }
				

Modification Type:MajorLast Reviewed:10/17/2003
Keywords:kbBug kbfix kbVC600fix KB167356