Microsoft KB Archive/167356

From BetaArchive Wiki

Article ID: 167356

Article Last Modified on 10/17/2003



APPLIES TO

  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 5.0 Professional Edition



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;
    }
                

Keywords: kbbug kbfix kbvc600fix KB167356