| 
FIX: C2243 on Friend Overload o
ID: Q148688
 
 | 
The information in this article applies to:
- 
The C/C++ Compiler (CL.EXE), included with:- 
Microsoft Visual C++, 32-bit Editions, versions  4.0, 4.1, 4.2
 
SYMPTOMS
The following error is generated:
   error C2243: 'abstract declarator' : conversion from 'class Derived *'
   to 'const class Base<Type> &' exists, but is inaccessible 
in code that contains all of the following:
- A template base class that has a friend function that overloads
   operator << for ostream.
- A derived class that privately inherits its base class and has a friend
   function that overloads operator << for ostream where the second
   argument to the operator << is a reference to const type (const
   Derived &).
- A call to the operator << passing a non-const derived type object.
RESOLUTION
Use one of the following two workarounds to resolve the problem:
- Typecast the derived object to a reference to const type when using
   the operator <<.
   -or-
- Make the base class public instead of private.
STATUS
Microsoft has confirmed this to be a bug in the Microsoft products listed
at the beginning of this article. This bug was corrected in Visual C++
version 5.0.
MORE INFORMATION
Sample Code
   /* Compile options needed: None
   */ 
   #include <iostream.h>
   template<class T>
   class Base;
   template<class T>
   ostream& operator<<(ostream& s, const Base<T> & a)
   {
      return s;
   }
   template<class T>
   class Base
   {
   public:
      friend ostream& operator<<(ostream& s, const Base<T>& a);
   };
   class Derived;
   ostream& operator<<(ostream& s, const Derived& a)
   {
      return s;
   }
   // Replace 'private' by 'public' in the following line
   // to avoid the error (work around # 2)
   class Derived : private Base<char> {
   public:
      friend ostream& operator<<(ostream& s, const Derived& a);
   };
   void main(void)
   {
      Derived objDerived;
      // The C2243 error is generated for the following line.
      // Uncomment the typecast to avoid the error (work around # 1)
      cout << /*(const Derived&)*/ objDerived;
   } 
Additional query words: 
kbVC400bug 
Keywords          : kbCompiler kbCPPonly kbLangCPP kbVC kbVC500fix 
Version           : 4.0 4.1 4.2
Platform          : NT WINDOWS 
Issue type        : kbbug