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


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