Microsoft KB Archive/168078

= FIX: C2784 Instantiating STL Objects with a UDT Parameter =

Article ID: 168078

Article Last Modified on 10/24/2003

-

APPLIES TO


 * Microsoft Visual C++ 5.0 Enterprise Edition
 * Microsoft Visual C++ 5.0 Professional Edition

-



This article was previously published under Q168078



SYMPTOMS
When you attempt to instantiate an STL component for a class, a C2784 error occurs, complaining that a relational operator (such as operator!= or operator>) is not defined. This in spite of including "using namespace std::rel_ops;", and defining operator< and operator== for the class.



CAUSE
The problem is caused by the nested namespace std::rel_ops. The compiler is unable to do a proper name lookup for the generic relational operators '!=', '<=', '>', '>=', which are defined in the namespace std::rel_ops and are referenced by several STL components.



RESOLUTION
The easiest workaround is to add a using declaration for the specific operator the compiler is complaining about. See the sections compiled conditionally upon WORKAROUND in the sample code below.



STATUS
Microsoft has confirmed that this is a problem in the Microsoft products that are listed at the beginning of this article. This problem was corrected in Microsoft Visual C++ version 6.0.



MORE INFORMATION
The following sample demonstrates the problem.

Sample Code
/*  Compile options: /GX */   #include

using namespace std ; using namespace std::rel_ops ;

#ifdef WORKAROUND  // define WORKAROUND to get around the error using std::rel_ops::operator!=; using std::rel_ops::operator>; #endif

class X {

int N;  public: X(int n) : N(n) {} bool operator==(const X& b) const { return N == b.N; } bool operator<(const X& b) const { return N < b.N; } };

list  xList;

int main {       return 0; }

Keywords: kbbug kbfix kbvc600fix KB168078

-

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

© Microsoft Corporation. All rights reserved.