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