FIX: C2988 on Conversion Operator Between Two Template Classes (143352)



The information in this article applies to:

  • Microsoft Visual C++, 32-bit Professional Edition 4.0
  • Microsoft Visual C++, 32-bit Professional Edition 4.1
  • Microsoft Visual C++, 32-bit Professional Edition 4.2
  • Microsoft Visual C++, 32-bit Enterprise Edition 4.2
  • Microsoft Visual C++, 32-bit Learning Edition 4.0
  • Microsoft Visual C++, 32-bit Learning Edition 4.2

This article was previously published under Q143352

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;
   }
				

Modification Type:MinorLast Reviewed:7/5/2005
Keywords:kbbug kbCompiler kbCPPonly kbfix kbVC500fix KB143352