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