Article: Q150573
Product(s): Microsoft C Compiler
Version(s): 4.1 4.2
Operating System(s):
Keyword(s): kbCompiler kbCPPonly kbVC kbVC500fix
Last Modified: 03-AUG-2001
-------------------------------------------------------------------------------
The information in this article applies to:
- The C/C++ Compiler (CL.EXE), included with:
- Microsoft Visual C++, 32-bit Editions, version 4.1
- Microsoft Visual C++, 32-bit Enterprise Edition, version 4.2
- Microsoft Visual C++, 32-bit Professional Edition, version 4.2
-------------------------------------------------------------------------------
SYMPTOMS
========
The following error occurs when a template class is explicitly instantiated and
it has more than one constructor, at least one of which does not have a body
defined and at least one of which is defined outside of the class:
error C2084: function '<function name>' already has a body
WORKAROUND
==========
This is the preferred workaround. Give every constructor a body. The body is
defined inside or outside the template class.
-or-
- Place all the existing constructor bodies inside the template class
definition.
NOTE: You get the following warning associated with the explicit instantiation
request:
warning C4661: <symbol> : no suitable definition provided for explicit
instantiation request
This warning is issued when a template class does not have all its members
defined and an explicit instantiation request is made. This warning also
causes the compiler to ignore the instantiation request.
-or-
- Instantiate the template class implicitly rather than explicitly. In this
case, the instantiation occurs when declaring an object using the template
class, but the C2084 does not.
NOTE: the sample code in this article gives examples of explicit versus implicit
template instantiation.
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: /c
*/
template <class T>
class A {
public:
A(); // give this ctor a body for workaround 1
A(const T&);
};
template <class T> A<T>::A(const T&) {}; // move this ctor body
// inside the class
// definition for
// workaround 2
template A<int>; // this is an explicit instantiation -
// comment this line out and uncomment the
// next line for workaround 3
// A<int> x = 3; // this is an implicit instantiation
Additional query words: kbVC400bug
======================================================================
Keywords : kbCompiler kbCPPonly kbVC kbVC500fix
Technology : kbVCsearch kbAudDeveloper kbCVCComp
Version : 4.1 4.2
Issue type : kbbug
Solution Type : kbfix
=============================================================================