I have a class representing a user called Nick
and I want to use std::find_if
on it, where I want to find if the userlist vector has an object included with the same username I pass in. I did a few attempts by trying to create a new Nick
object for the username I want to test and overloading the == operator
and then trying to use find/find_if
on the object:
std::vector<Nick> userlist;
std::string username = "Nicholas";
if (std::find(userlist.begin(), userlist.end(), new Nick(username, false)) != userlist.end())) {
std::cout << "found";
}
I have overloaded the == operator
so comparing Nick == Nick2 should work, but the function returns error C2678: binary '==' : no operator found which takes a left-hand operand of type 'Nick' (or there is no acceptable conversion)
.
Here is my Nick class for reference:
class Nick {
private:
Nick() {
username = interest = email = "";
is_op = false;
};
public:
std::string username;
std::string interest;
std::string email;
bool is_op;
Nick(std::string d_username, std::string d_interest, std::string d_email, bool d_is_op) {
Nick();
username = d_username;
interest = d_interest;
email = d_email;
is_op = d_is_op;
};
Nick(std::string d_username, bool d_is_op) {
Nick();
username = d_username;
is_op = d_is_op;
};
friend bool operator== (Nick &n1, Nick &n2) {
return (n1.username == n2.username);
};
friend bool operator!= (Nick &n1, Nick &n2) {
return !(n1 == n2);
};
};
You have to define operator== with two Objects outside your class, as a tool function, not a member.
Then to make it friend just put the declaration of the function inside the class.
try something like this:
Also your find should look like this:
No need of "new".
I am noticing you are trying to call one constructor from another in this manner:
Well, sorry, but this doesn't work. The line
Nick()
just creates a temporary and doesn't affectthis
. Constructor forwarding is only possible in C++0x (the upcoming standard)As to your problem - this question asked a couple of days ago about binary_search covers the same grounds. The top answer is just awesome.
Mystical restriction on std::binary_search
HTH.
P.S. Ideally this should have been a comment, but it's just too verbose
You are passing a pointer to the find function. Drop the new:
Also, your operators should accept their arguments by const reference, they don't modify them.
You can use boost::bind
just implement bool Nick::isFound()
You can also pass the criteria
implement
I know that you wanted to overload the
==
operator, but the same thing can easily be done with a predicate:Note that in C++0x, you can do the same thing with a lambda expression much more concisely.
If you are using C++0X you can use a simple lambda expression