FIX: C2784 Instantiating STL Objects with a UDT Parameter

ID: Q168078


The information in this article applies to:
  • Microsoft Visual C++, 32-bit Editions, version 5.0


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 this to be a problem in the Microsoft products 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 <list>

   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 <X> xList;

   int main()
   {
        return 0;
   } 

Additional query words:

Keywords : kbtool kbVC500bug kbVC600fix
Version : winnt:5.0
Platform : winnt
Issue type : kbbug


Last Reviewed: March 27, 1999
© 2000 Microsoft Corporation. All rights reserved. Terms of Use.