FIX: C2248: Statics in Friends, No Access to Protected Members (167966)



The information in this article applies to:

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

This article was previously published under Q167966

SYMPTOMS

When you create a static object created in a friend function, it is denied access to protected members of a class and compiler error C2248 appears as follows:
'member' : cannot access protected member declared in class 'class'

RESOLUTION

Create the static object using the new operator.

STATUS

Microsoft has confirmed that this is a bug in the Microsoft products that are listed at the beginning of this article.

This problem was corrected in Microsoft Visual C++ .NET.

MORE INFORMATION

The following sample demonstrates the problem and the workaround.

Sample Code

   #include <iostream>

   //#define WORKAROUND //Uncomment this line for workaround

   class A
   {
   protected:
   A() { std::cout << "A()" << std::endl ;}
   ~A() { std::cout << "~A()" << std::endl ;};

   friend A* GetA();
   };

   A* GetA()
   {
   #ifndef WORKAROUND

     static A a ;
     return &a ;

   #else

     static A *pA = new A;
     return pA;

   #endif
   }

   void main()
   {
    A *pA = GetA() ;
   }
				

Modification Type:MinorLast Reviewed:7/5/2005
Keywords:kbBug kbcode kbfix kbNoUpdate KB167966