FIX: C2988 on Conversion Operator Between Two Template Classes

ID: Q143352


The information in this article applies to:
  • Microsoft C/C++ Compiler (CL.EXE), included with:
    • Microsoft Visual C++ 32-bit Edition, versions 4.0, 4.1, 4.2


SYMPTOMS

When a conversion operator between two template classes is defined outside the template class, you may receive this error:

error C2988: unrecognizable template declaration/definition


RESOLUTION

Define the conversion operator inside the template class body.


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 to Reproduce Problem


   /* Compile options needed: None
   */ 

   //#define _WORKAROUND   //uncomment this line to work around

   template<class T>
   class classA
   {
   public:

       classA(T& t) : m_t(t) {}

   protected:
       T m_t;
   };


   template<class T>
   class classB
   {
   public:

      classB(const T& t) : m_t(t) {}

   #ifndef _WORKAROUND
      operator classA<T>();

   #else
      operator classA<T>()   { return classA<T>(m_t); }

   #endif

   protected:
       T m_t;
   };


   #ifndef _WORKAROUND

   // Error C2988 for the following function definition.

   template<class T>
   classB<T>::operator classA<T>()
   {
       return classA<T>(m_t);
   }

   #endif

   void main()
   {

       classB<int> b(2);

      // Invoke template<class T> classB<T>::operator classA<T>()
       classA<int> a = b;
   } 

Additional query words: kbVC400bug inline

Keywords : kbCompiler kbCPPonly kbVC kbVC500fix
Version : :4.0,4.1,4.2
Platform : NT WINDOWS
Issue type : kbbug


Last Reviewed: January 31, 2000
© 2000 Microsoft Corporation. All rights reserved. Terms of Use.