Markus Schoder wrote:
Jellicle wrote:
But I cannot compile the codes successfully in Visual C++ 6.0.
You probably need a newer compiler.
Try this (I didn't test it, but it compiles :-) ). I think it should
work with VC++ 6, and it works with keys of different types and
different names:
#include <vector>
#include <cassert>
using namespace std;
template<class Iterator, typename key_type, typename T>
Iterator minfield(
Iterator start,
const Iterator &end,
key_type T::*p)
{
key_type acc = (*start).*p;
Iterator min_i(start);
++start;
while(start != end)
{
const key_type &r = (*start).*p;
if(r < acc)
{
acc = r;
min_i = start;
}
++start;
}
return min_i;
}
struct S1
{
typedef int key_type;
key_type key1;
S1( key_type key ) : key1(key) {}
};
struct S2
{
typedef double key_type;
key_type key2;
S2( key_type key ) : key2(key) {}
};
int main()
{
std::vector<S1> v1;
v1.push_back( S1(1) );
v1.push_back( S1(5) );
v1.push_back( S1(-10) );
v1.push_back( S1(3) );
vector<S1>::const_iterator m1 = minfield(
v1.begin(), v1.end(), &S1::key1 );
assert( m1->key1 == -10 );
std::vector<S2> v2;
v2.push_back( S2(1.1) );
v2.push_back( S2(5.1) );
v2.push_back( S2(-1.1) );
v2.push_back( S2(3.1) );
vector<S2>::const_iterator m2 = minfield(
v2.begin(), v2.end(), &S2::key2 );
assert( m2->key2 == -1.1 );
return 0;
}
Cheers! --M
Thank you, mlimber. I am really grateful for you kind help!
somewhere else. So I cannot redefine them.