Re: operator < stopped working
raan wrote:
All were working well until I decided to add a copy constructor.
Please see the program. I am getting
"c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include
\functional(139) : error C2679: binary '<' : no operator found which
takes a right-hand operand of type 'const D' (or there is no
acceptable conversion)
"
Seems like I can't guarantee constant-ness anymore with the copy
constructor. How do I get around with this ?
// test-sets.cpp : Defines the entry point for the console
application.
//
#include "stdafx.h"
#include <iostream>
#include <set>
#include <map>
using namespace std;
class D
{
private:
string a;
public:
//Constructor
D()
{
};
Please drop the semicolons after the function bodies. They are
so ugly.
//Destructor
~D()
{
};
//Copy constructor
D(D& d)
The usual signature (the compiler-generated one's at least) is
D(D const& d)
{
};
std::string& getA()
{
return a;
}
There is also a need to have a const version of that function:
std::string const& getA() const
{
return a;
}
Don't let it throw you off that they have the same body, they are
different!
bool operator < (D d) const
The usual (idiomatic) way is to pass the operand by a reference
to cons:
bool operator < (D const& d) const
{
if(a.compare(d.getA()) <0){
return true;
}else {
return false;
}
}
};
int main()
{
typedef std::set<D> dsets;
WHY?
D *d = new D();
WHY?
dsets s;
s.insert(*d);
Eek!
return 0;
}
What you should write is
std::set<D> dsets;
dsets.insert(D());
Or at least
std::set<D> dsets;
D d;
dsets.insert(d);
Drop the habit of doing "new" all the time. Besides, you're
inconsistent. You didn't 'new' your 'dsets' object!
V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask