Article: Q131066
Product(s): Microsoft C Compiler
Version(s): 2.00 2.10
Operating System(s):
Keyword(s): kberrmsg kbCompiler kbCPPonly kbVC kbprb
Last Modified: 29-JUL-2001
-------------------------------------------------------------------------------
The information in this article applies to:
- The C/C++ Compiler (CL.EXE), included with:
- Microsoft Visual C++, 32-bit Editions, versions 2.0, 2.1
-------------------------------------------------------------------------------
SYMPTOMS
========
The compiler generates the following error message when the friend function in a
template class is not prototyped:
Error C2922: 'symbol' a friend function of a template
class must have been previously defined
CAUSE
=====
Friend functions must be declared before they are used in a template class. You
cannot have a friend function defined within a class definition. This is a
Microsoft Specific requirement. Templates are not officially standardized and,
as a result, different C++ compiler vendors have implemented them differently,
so this requirement may change in future versions of the compiler.
RESOLUTION
==========
Declare the friend function before using it in the template definition.
STATUS
======
This behavior is by design.
MORE INFORMATION
================
For more information about the Microsoft-specific implementations on the
templates, please see the Books Online under C/C++, C++ Language Reference,
Chapter 6 Declarations, Template Specifications, Differences from Other
Implementations.
Sample Code to Demonstrate Behavior
-----------------------------------
/* Compile options : /Ze ( default option )
*/
#include <iostream.h>
template <class T> class A; // Forward declaration
// Change the following line from a comment into an executed line to
// prevent the compiler error with Visual C++, 32-bit edition, version 2.0
// or 2.1:
// template <class T> ostream& operator<< (ostream &s, const A<T> &b);
template <class T>
class A {
public:
friend ostream & operator << (ostream &s, const A<T> &b);
};
template <class T> ostream& operator<< (ostream &s, const A<T> &b)
{
return s << "testing";
}
void main()
{
A<int> fa;
cout << fa;
}
Additional query words: 2.00 2.10 8.0 8.00 8.0c 8.00c 9.0 9.00 9.1 9.10
======================================================================
Keywords : kberrmsg kbCompiler kbCPPonly kbVC kbprb
Technology : kbVCsearch kbAudDeveloper kbCVCComp
Version : 2.00 2.10
Issue type : kbprb
=============================================================================