FIX: C2065 When Default Constructor of a Nested Class Called (168373)



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 Q168373

SYMPTOMS

When the default constructor of a nested class gets called, it causes the C2065 compiler error:
'identifier' : undeclared identifier

RESOLUTION

Please see the MORE INFORMATION section for a 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

NOTE: Because constructors do not have names, they are never found during name lookup; however an explicit type conversion using the functional notation causes a constructor to be called to initialize an object. (This information came from the C++ Working Paper.)

The following sample code demonstrates the problem and the workaround.

Sample Code

   /*
   Compile options: None
   */ 

   class Base
   {
   public:

       class Common
       {
       public:
          Common(){};
       };
       class Derived : public Common
       {
       public:
          Derived() {}
          Derived(int n) {}
       };
       Base( const Common &theCommon) {}
   };

   int main(void)
   {
       Base B1(Base::Derived());  //C2065 here

       // Workaround: Comment the above line
       // Uncomment the following lines
       // Base::Derived D ;
       // Base B1(D) ;
       return 0;
   }
				

Modification Type:MajorLast Reviewed:10/17/2003
Keywords:kbBug kbcode kberrmsg kbfix kbVC600fix KB168373