operator < stopped working

R

raan

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()
{
};
//Destructor
~D()
{
};
//Copy constructor
D(D& d)
{
};
std::string& getA()
{
return a;
}
bool operator < (D d) const
{
if(a.compare(d.getA()) <0){
return true;
}else {
return false;
}
}
};

int main()
{
typedef std::set<D> dsets;
D *d = new D();
dsets s;
s.insert(*d);
return 0;
}
 
V

Victor Bazarov

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

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,007
Latest member
obedient dusk

Latest Threads

Top