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:
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