Microsoft KB Archive/177431

From BetaArchive Wiki
Knowledge Base


Article ID: 177431

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 Q177431

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 ;
   }
                

Keywords: kbbug kbfix kbvc600fix KB177431