STL binary_function in VS 2005
Hi,
I recently upgraded from Visual Studio 2003 to Visual Studio 2005.
I'm trying to make my code compile under the new version, but am running
into several problems, mainly in the parts using STL.
Below is a code snippet I created for testing one of the problems that
is starting to give me a headache. For some reason mixing types in the
binary_function template goes horribly wrong in the lower_bound function
(for the example I just used a pointer as the other type, but in the
legacy code this is in fact a completely different class).
Can anyone help me out?
The snippet compiles without warnings or errors under VS2003 (and works
just fine) but gives the following error under VS2005:
c:\program files\microsoft visual studio 8\vc\include\xutility(314) :
error C2664: 'bool TestFind::operator ()(const Test &,const Test *)
const' : cannot convert parameter 1 from 'Test *__w64 const ' to 'const
Test &'
Reason: cannot convert from 'Test *__w64 const ' to 'const Test'
No constructor could take the source type, or constructor
overload resolution was ambiguous
c:\program files\microsoft visual studio
8\vc\include\algorithm(2028) : see reference to function template
instantiation 'bool std::_Debug_lt_pred<_Pr,Test,_Ty>(_Pr,_Ty1 &,const
_Ty2 &,const wchar_t *,unsigned int)' being compiled
....
Why does VS2005 use the pointer as the left operand, while VS2003 uses
it as the right operand?
Thanks in advance,
Sytse.
// Console.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include<algorithm>
#include<vector>
#include<cmath>
#include<functional>
class Test
{
private:
int m_A;
public:
Test()
:m_A( rand() )
{
}
int Get()const
{
return m_A;
}
};
//Used for sorting the vector
class TestSort : public std::binary_function<Test,Test,bool>
{
public:
bool operator()(const Test& l, const Test& r)const
{
return l.Get() < r.Get();
}
};
//Used for finding elements
class TestFind : public std::binary_function<Test,Test*,bool>
{
public:
//Swapping the parameters does not solve the error
bool operator()(const Test& l, const Test* r)const
{
return l.Get() < r->Get();
}
/*Adding this function does not solve the problem
bool operator()(const Test* l, const Test& r)const
{
return l->Get() < r.Get();
}*/
};
int _tmain(int argc, _TCHAR* argv[])
{
std::vector<Test> testvect;
for(int i=0;i<255;++i)
testvect.push_back( Test() );
TestSort ts;
std::make_heap( testvect.begin(), testvect.end(), ts);
std::sort_heap( testvect.begin(), testvect.end(), ts);
Test t;
TestFind tf;
std::vector<Test>::iterator it = std::lower_bound(testvect.begin(),
testvect.end(), &t, tf);
return 0;
}