BUG: Same Name for Function and Class Causes C2079

Last reviewed: April 24, 1997
Article 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;

Look at the More Information section for a sample that demonstrates the workaround.

STATUS

Microsoft has confirmed this to be a bug in the Microsoft products listed at the beginning of this article. We are researching this bug and will post new information here in the Microsoft Knowledge Base as it becomes available.

MORE INFORMATION

Section 7.3.3, paragraph 10 of the 1997 C++ Public Review Document states:

   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 entity, 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 enumera-
     tion 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 : CLIss kbtool vcbuglist500 kbbuglist
Version : 5.0
Platform : NT WINDOWS
Issue type : kbbug


THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY.

Last reviewed: April 24, 1997
© 1998 Microsoft Corporation. All rights reserved. Terms of Use.