Trying to overload + for class to add to string 'is illegal'

Reply

Join Date: Feb 2005
Posts: 466
Reputation: winbatch is on a distinguished road 
Solved Threads: 18
winbatch's Avatar
winbatch winbatch is offline Offline
Posting Pro in Training

Trying to overload + for class to add to string 'is illegal'

 
0
  #1
Apr 25th, 2005
Hi,

I'm trying to write code such that my class can be used like so:
To accomplish this,
I'm trying to overload the + operator of my class to return a string. I am able to do this, but when I try and do the operation above, I get:


Error: The operation "std::basic_string<char, std::char_traits<char>, std::allocator<char>> + Dan" is illegal.

What does this mean and how do I make it legal?

class Dan
{
public:
string first;
string last;


const string operator + (Dan & a)
{
return a.toString();
}

string toString()
{
return first + ", " + last;
}

....


Dan temp;
string myString = "Test" + temp;
Reply With Quote Quick reply to this message  
Join Date: Sep 2004
Posts: 7,625
Reputation: Narue has a reputation beyond repute Narue has a reputation beyond repute Narue has a reputation beyond repute Narue has a reputation beyond repute Narue has a reputation beyond repute Narue has a reputation beyond repute Narue has a reputation beyond repute Narue has a reputation beyond repute Narue has a reputation beyond repute Narue has a reputation beyond repute Narue has a reputation beyond repute 
Solved Threads: 714
Team Colleague
Narue's Avatar
Narue Narue is offline Offline
Code Goddess

Re: Trying to overload + for class to add to string 'is illegal'

 
0
  #2
Apr 25th, 2005
  1. string operator+ ( const string& s, const Dan& d )
  2. {
  3. return s + d.toString();
  4. }
Since Dan doesn't have a suitable conversion to std::string, you also would need to provide another operator+ with the commutative operation:
  1. string operator+ ( const Dan& d, const string& s )
  2. {
  3. return s + d.toString();
  4. }
toString should also be const since it doesn't modify the state of your object:
  1. string toString() const
  2. {
  3. return first + ", " + last;
  4. }
I'm here to prove you wrong.
Reply With Quote Quick reply to this message  
Join Date: Feb 2005
Posts: 466
Reputation: winbatch is on a distinguished road 
Solved Threads: 18
winbatch's Avatar
winbatch winbatch is offline Offline
Posting Pro in Training

Re: Trying to overload + for class to add to string 'is illegal'

 
0
  #3
Apr 25th, 2005
Narue,

I tried what you posted, but it complains:

Test.cpp", line 13: Error: Illegal number of arguments for Dan::operator+(const std::basic_string<char, std::char_traits<char>, std::allocator<char>>&, const Dan&).
Reply With Quote Quick reply to this message  
Join Date: Sep 2004
Posts: 7,625
Reputation: Narue has a reputation beyond repute Narue has a reputation beyond repute Narue has a reputation beyond repute Narue has a reputation beyond repute Narue has a reputation beyond repute Narue has a reputation beyond repute Narue has a reputation beyond repute Narue has a reputation beyond repute Narue has a reputation beyond repute Narue has a reputation beyond repute Narue has a reputation beyond repute 
Solved Threads: 714
Team Colleague
Narue's Avatar
Narue Narue is offline Offline
Code Goddess

Re: Trying to overload + for class to add to string 'is illegal'

 
0
  #4
Apr 25th, 2005
>I tried what you posted
No, you didn't. You tried some oddball variation of what I posted after filtering it through your n00b brain. Neither my code nor my comments suggested that operator+ should be a member function. Since toString is a public member function of Dan, neither of the overloads for operator+ should even be friends of Dan. Like this:
  1. class Dan {
  2. // Data members
  3. public:
  4. string toString() const;
  5. // No operator+ here
  6. };
  7.  
  8. string operator+ ( const string& s, const Dan& d )
  9. {
  10. return s + d.toString();
  11. }
  12.  
  13. string operator+ ( const Dan& d, const string& s )
  14. {
  15. return s + d.toString();
  16. }
>but it complains
I'm not surprised. When implemented as a member function, operator+ expects only one argument. When implemented as a non-member function, operator+ expects two arguments. The two are not interchangeable.
I'm here to prove you wrong.
Reply With Quote Quick reply to this message  
Join Date: Feb 2005
Posts: 466
Reputation: winbatch is on a distinguished road 
Solved Threads: 18
winbatch's Avatar
winbatch winbatch is offline Offline
Posting Pro in Training

Re: Trying to overload + for class to add to string 'is illegal'

 
0
  #5
Apr 25th, 2005
I appreciate the help, (and the insults not so much). In either case, it works now. By the way, I only seemed to need one of the functions, not both. Why do you think I need both?

Also, I changed it to return the first + ", " + last directly since first and last are not const so I couldn't return them using the toString.
Reply With Quote Quick reply to this message  
Join Date: Sep 2004
Posts: 7,625
Reputation: Narue has a reputation beyond repute Narue has a reputation beyond repute Narue has a reputation beyond repute Narue has a reputation beyond repute Narue has a reputation beyond repute Narue has a reputation beyond repute Narue has a reputation beyond repute Narue has a reputation beyond repute Narue has a reputation beyond repute Narue has a reputation beyond repute Narue has a reputation beyond repute 
Solved Threads: 714
Team Colleague
Narue's Avatar
Narue Narue is offline Offline
Code Goddess

Re: Trying to overload + for class to add to string 'is illegal'

 
0
  #6
Apr 25th, 2005
>and the insults not so much
I can live with that.

>Why do you think I need both?
Users of your class will rightfully expect Dan + string to work just as well as string + Dan. Of course, in hindsight I should have written:
  1. string operator+ ( const Dan& d, const string& s )
  2. {
  3. return d.toString() + s;
  4. }
Instead of pasting the body of the other operator+. This way users will get the expected behavior for string concatenation.

>I changed it to return the first + ", " + last directly
Not a good idea. Eventually you'll learn that public data members are a bad thing and make them private, then your code will break. You'll either have to use a public interface for the operators, or make them friends of your class. Both of those entail work on your part, so it's better to do it right from the start.

>since first and last are not const so I couldn't return them using the toString.
That shouldn't matter. A non-const object can be converted to a const object implicitly. The inverse is not true, but that's not the case here. Show me the code that's causing the error, preferably something I can compile directly so I don't accidentally fix something by writing framework code.
I'm here to prove you wrong.
Reply With Quote Quick reply to this message  
Reply

This thread is more than three months old.
Perhaps start a new thread instead?
Message:


Thread Tools Search this Thread



About Us | Contact Us | Advertise | DaniWeb | Acceptable Use Policy | RSS Feed

©2003 - 2009 DaniWeb® LLC