Still celebrating National IT Professionals Day with 3 months of free Premium Membership. Use Code ITDAY17

x
?
Solved

Overloading same operators in seperate classes causes  "ambiguos operator" error?

Posted on 2003-11-17
21
Medium Priority
?
675 Views
Last Modified: 2013-12-14
Can anyone tell me why adding the Tag class definition causes the overload lines of Category
to report an "ambiguos operator" error?

Thanks,

str8dn.

The two actual errors are :
error C2593: 'operator <' is ambiguous
error C2593: 'operator ==' is ambiguous


Here's the code:

#include <cstring>
#include <vector>

#include <iostream>
#include <fstream.h>      // ifstream, ofstream objects


typedef std::string string;
typedef std::vector<string> VString;


class Tag
{
private:
      string nameString;
      
public:
      Tag(string passedName) : nameString(passedName)
      { }

      ~Tag()
      { }


      friend bool operator<(const Tag&, const Tag&);
      friend bool operator==(const Tag&, const Tag&);

};

bool operator <(const Tag& t1, const Tag& t2)
{
      return(t1.nameString < t2.nameString) ? true : false;
}

bool operator ==(const Tag& t1, const Tag& t2)
{
      return(t1.nameString == t2.nameString) ? true : false;
}



//////////// End of "Tag" class definition ////////////////

class Category
{
private:
      string nameString;
      
public:
      Category(string passedName) : nameString(passedName)
      { }

      ~Category()
      { }

      string& name(string& passedName)
      {
            nameString = passedName;
            return nameString;
      }

      string& name()
      {
            return nameString;
      }
      
      const string displayString() {
            string tempDisplayString = nameString;
            
            return tempDisplayString;
      }
      
      void display() {
            cout << "Category display:" <<endl;
            cout << displayString().c_str() <<endl;
      }
      friend bool operator<(const Category&, const Category&);
      friend bool operator==(const Category&, const Category&);

};

bool operator <(const Category& c1, const Category& c2)
{
      return(c1.nameString < c2.nameString) ? true : false;
}

bool operator ==(const Category& c1, const Category& c2)
{
      return(c1.nameString == c2.nameString) ? true : false;
}

//////////// End of "Category" class definition ////////////////

void main (const int argc, const char *argv[])
{
      exit(0);
}
0
Comment
Question by:str8dn
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 8
  • 6
  • 6
  • +1
21 Comments
 
LVL 13

Assisted Solution

by:SteH
SteH earned 375 total points
ID: 9764495
Perhaps not related but
#include <iostream>
#include <fstream.h>     // ifstream, ofstream objects
old and new style STL? or did you meant
#include <iostream>
#include <fstream>
0
 
LVL 13

Expert Comment

by:SteH
ID: 9764513
Are those two files linked somehow? Are in one of those files both headers included?
0
 
LVL 86

Expert Comment

by:jkr
ID: 9764522
And *where* does the error occur? :o)
0
What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

 
LVL 1

Expert Comment

by:Gratch06
ID: 9764565
This compiles just fine for me....
0
 
LVL 86

Expert Comment

by:jkr
ID: 9764602
>>This compiles just fine for me....

Not really surprising - the above code does not use the operators.
0
 
LVL 1

Author Comment

by:str8dn
ID: 9764608
Sorry, the "ambiguous operator" errors occur at
bool operator <(const Category& c1, const Category& c2)
-and-
bool operator ==(const Category& c1, const Category& c2)

If I remove the Tag definition code (leaving Category definition intact) it seems to be ok.
0
 
LVL 1

Author Comment

by:str8dn
ID: 9764651
For some reason '<fstream>' screams (without the .h)
Im using VC++ 6.0, but it is entirely possible I did not to some configuration correctly.

Thanks,

str8dn
0
 
LVL 13

Expert Comment

by:SteH
ID: 9764699
No problem for me to use <fstream> on VC++ 6.0 SP5.
0
 
LVL 1

Author Comment

by:str8dn
ID: 9764739
<fstream> (when not using the .h) screams by causing 'cout' to no longer be recognized.
0
 
LVL 13

Expert Comment

by:SteH
ID: 9764752
Is there some more code in this project? It seems like there is a either a constructor
Tag (Category&) or the other way round.
0
 
LVL 13

Expert Comment

by:SteH
ID: 9764765
Since you do not have a line
using namespace std;
you need to use
std::cout if I remember correctly.
0
 
LVL 1

Author Comment

by:str8dn
ID: 9764791
There was lots more code, but I still get the errors when I run what I posted, so I figured
the widdled down code would be easier to decipher...

Thanks,

str8dn
0
 
LVL 86

Expert Comment

by:jkr
ID: 9764804
SoIs the above the *exact* code, i.e. the classes are not derived or anything else?
0
 
LVL 13

Expert Comment

by:SteH
ID: 9764866
Try to replace <fstring.h> with <fstring>
0
 
LVL 1

Author Comment

by:str8dn
ID: 9764942
Yes, the above is the exact code.  I run it 'as is' and get both errors.
The Category::displayString and Category::display methods can be removed without changing the error too.

Thanks,

str8dn
0
 
LVL 13

Expert Comment

by:SteH
ID: 9764947
I changed the head to

#include <string> // not <cstring>
#include <vector>

#include <iostream>
#include <fstream>     // not <fstream.h>


using namespace std;

class Tag
{

[]

Now I get errors in
the definitions that private member nameString cannot be accessed
0
 
LVL 13

Expert Comment

by:SteH
ID: 9765013
<cstring> includes <string.h>
This mixes old and new style STL classes. The ambiguity comes somehow from the string definition.
Using the following code at the beggining
#include <string>
#include <vector>

#include <iostream>
#include <fstream>     // ifstream, ofstream objects

typedef std::string string;

class Tag
{
[]
and replacing cout with std::cout and endl with std::endl
lets you compile everything. I am not sure why you are not allowed to use
using namespace std;
0
 
LVL 86

Expert Comment

by:jkr
ID: 9765037
This compiles just fine:

#include <string>
#include <vector>

#include <iostream>
#include <fstream>     // ifstream, ofstream objects

using namespace std;


typedef std::vector<string> VString;


class Tag
{
private:
    string nameString;
   
public:
    Tag(string passedName) : nameString(passedName)
    { }

    ~Tag()
     { }


    friend bool operator<(const Tag&, const Tag&);
    friend bool operator==(const Tag&, const Tag&);

};

bool operator <(const Tag& t1, const Tag& t2)
{
    return(t1.nameString < t2.nameString) ? true : false;
}

bool operator ==(const Tag& t1, const Tag& t2)
{
    return(t1.nameString == t2.nameString) ? true : false;
}



//////////// End of "Tag" class definition ////////////////

class Category
{
private:
    string nameString;
   
public:
    Category(string passedName) : nameString(passedName)
    { }

    ~Category()
     { }

    string& name(string& passedName)
     {
         nameString = passedName;
         return nameString;
    }

    string& name()
     {
         return nameString;
    }
   
     const string displayString() {
         string tempDisplayString = nameString;
         
         return tempDisplayString;
    }
   
     void display() {
         cout << "Category display:" <<endl;
         cout << displayString().c_str() <<endl;
    }
    friend bool operator<(const Category&, const Category&);
    friend bool operator==(const Category&, const Category&);

};

bool operator <(const Category& c1, const Category& c2)
{
    return(c1.nameString < c2.nameString) ? true : false;
}

bool operator ==(const Category& c1, const Category& c2)
{
    return(c1.nameString == c2.nameString) ? true : false;
}

//////////// End of "Category" class definition ////////////////

void main (const int argc, const char *argv[])
{
    exit(0);
}
0
 
LVL 86

Accepted Solution

by:
jkr earned 375 total points
ID: 9765053
It seems that the mixed usage of header files was causing the problem.
0
 
LVL 1

Author Comment

by:str8dn
ID: 9765063
Thanks, I guess <cstring> was the problem?  
Are there drawbacks to using namespace std?
0
 
LVL 86

Expert Comment

by:jkr
ID: 9765090
>>Are there drawbacks to using namespace std?

No. At least, not that I ever encountered any.
0

Featured Post

Concerto's Cloud Advisory Services

Want to avoid the missteps to gaining all the benefits of the cloud? Learn more about the different assessment options from our Cloud Advisory team.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Article by: SunnyDark
This article's goal is to present you with an easy to use XML wrapper for C++ and also present some interesting techniques that you might use with MS C++. The reason I built this class is to ease the pain of using XML files with C++, since there is…
Many modern programming languages support the concept of a property -- a class member that combines characteristics of both a data member and a method.  These are sometimes called "smart fields" because you can add logic that is applied automaticall…
The viewer will learn how to use and create keystrokes in Netbeans IDE 8.0 for Windows.
The viewer will learn how to use and create new code templates in NetBeans IDE 8.0 for Windows.

705 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question