Microsoft KB Archive/131066

= PRB: C2922 Error for Class Template Containing Friend Function =

Article ID: 131066

Article Last Modified on 7/5/2005

-

APPLIES TO


 * Microsoft Visual C++ 2.0 Professional Edition
 * Microsoft Visual C++ 2.1

-



This article was previously published under Q131066



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 )


 * 1) include 

template  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  ostream& operator<< (ostream &s, const A &b);

template  class A { public: friend ostream & operator << (ostream &s, const A &b); };

template  ostream& operator<< (ostream &s, const A &b) {  return s << "testing"; }

void main {  A 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 kbprb kbcpponly kbcompiler KB131066

-

[mailto:TECHNET@MICROSOFT.COM Send feedback to Microsoft]

© Microsoft Corporation. All rights reserved.