PRB: C2248: No Access for Friend Class in a Template Class

ID: Q168384


The information in this article applies to:
  • Microsoft Visual C++, 32-bit Editions, versions 5.0, 6.0


SYMPTOMS

Declaring a template parameter type as a friend class of a template class, causes the compiler error C2248:

error C2248: 'xx' : cannot access private member declared in class 'XX<class T>'
Member access is not granted to friend class T, where T is a template parameter of the template class XX.


CAUSE

The compiler treats typename T as a regular C++ class and not a template parameter type. This implies the following:

  • typename T, where T is a template parameter type is not granted access to private members of the template class.


  • A regular C++ class named class T is granted access to private members of the template class.



RESOLUTION

Do not declare a template parameter type as a friend of a template class. Specify the friend class using the regular C++ class name.


STATUS

This behavior is by design as per C++ standard section 7.1.5.3 paragraph 2.


MORE INFORMATION

The following sample code demonstrates the problem.

Sample Code


  /*
   * Compiler Options: none
   */ 

   template <typename T>
   class Test
   {
      //template parameter T declared as friend class
      friend class T ;
      int m_i ;
   } ;


   class B
   {
   public:
      //Cannot access private member of template class Test
      //since class B is not recognized as friend class of
      //template class Test
      B() { tB.m_i = 0 ;} //C2248 here
      Test<B> tB ;
   } ;

   int main()
   {
      B bObj ;
      return 0 ;
   } 

Additional query words:

Keywords : kberrmsg kbtool kbCompiler kbCPPonly kbLangCPP kbVC kbVC500 kbVC600
Version : winnt:5.0,6.0
Platform : winnt
Issue type : kbprb


Last Reviewed: May 18, 1999
© 2000 Microsoft Corporation. All rights reserved. Terms of Use.