FIX: C2065: Undeclared Identifier Creating a STL Function Object

ID: Q177431


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


SYMPTOMS

Creating the STL function object "binder2nd" causes the compiler to generate the following error C2065:

'identifier' : undeclared identifier
It is the std::multiples<int>(): line that causes the namespace to be lost.


RESOLUTION

Use one of the following methods to work around this problem:

  • Use the "using namespace" directive instead of qualifying the function objects.


  • Pre-declare an instance of std::multiplies<int> to solve the problem.



STATUS

Microsoft has confirmed this to be a bug in the Microsoft product listed at the beginning of this article. This problem was corrected in Visual C++ version 6.0 for Windows.


MORE INFORMATION

The following sample demonstrates the problem and the first workaround:


   /*
   * Compiler Options: /GX
   */ 

   #include <algorithm>
   #include <functional>
   #include <iostream>

   #define BUG
   //Workaround: Comment the line above.
   //Uncomment the line below.
   //#define WORKAROUND

   #ifdef WORKAROUND
   using namespace std ;
   #endif

   int main()
   {

   #ifdef BUG

      std::binder2nd< std::multiplies<int> >
                     times_two(std::multiplies<int>(), 2);
   #endif
   #ifdef WORKAROUND
       binder2nd< multiplies<int> > times_two(multiplies<int>(), 2);
   #endif

      int n = times_two(4) ;
      std::cout << "n = " << n << std::endl ;
      return 0 ;
   } 

The following sample demonstrates the problem and the second workaround:

   /*
   * Compiler Options: /GX
   */ 

   #include <algorithm>
   #include <functional>
   #include <iostream>

   #define BUG
   //Workaround: Comment the line above.
   //Uncomment the line below.
   //#define WORKAROUND

   int main()
   {

   #ifdef BUG

      std::binder2nd< std::multiplies<int> >
                     times_two(std::multiplies<int>(), 2);

   #endif

   #ifdef WORKAROUND

      std::multiplies<int> mi ;
      std::binder2nd< std::multiplies<int> > times_two(mi, 2);

   #endif

      int n = times_two(4) ;
      std::cout << "n = " << n << std::endl ;
      return 0 ;
   } 


REFERENCES

Please see the following help topics in the Microsoft Visual C++ online documentation for more information on "binder2nd":

TITLE: binder2nd
URL: mk:@ivt:vclang/STDLIBBLD/FUNCTIO2_BINDER2ND.HTM

TITLE: Visual C++ 4.2 Standard Template Library Tutorial
URL: mk:@ivt:tatech/F1/DB/S4249.HTM#sec58

Additional query words:

Keywords : kbCompiler kbCPPonly kbLangCPP kbVC kbVC500bug kbVC600fix STLIss
Version :
Platform : winnt
Issue type : kbbug


Last Reviewed: January 31, 2000
© 2000 Microsoft Corporation. All rights reserved. Terms of Use.