Article: Q177431
Product(s): Microsoft C Compiler
Version(s): 5.0
Operating System(s):
Keyword(s): kbVC600fixkbbuglist
Last Modified: 07-MAY-2001
-------------------------------------------------------------------------------
The information in this article applies to:
- Microsoft Visual C++, 32-bit Enterprise Edition, version 5.0
- Microsoft Visual C++, 32-bit Professional Edition, 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 ;
}
Additional query words:
======================================================================
Keywords : kbVC600fix kbbuglist
Technology : kbVCsearch kbAudDeveloper kbVC500 kbVC32bitSearch kbVC500Search
Version : :5.0
Issue type : kbbug
Solution Type : kbfix
=============================================================================