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

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);
}
LVL 1
str8dnAsked:
Who is Participating?

[Product update] Infrastructure Analysis Tool is now available with Business Accounts.Learn More

x
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

SteHCommented:
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
SteHCommented:
Are those two files linked somehow? Are in one of those files both headers included?
0
jkrCommented:
And *where* does the error occur? :o)
0
Rowby Goren Makes an Impact on Screen and Online

Learn about longtime user Rowby Goren and his great contributions to the site. We explore his method for posing questions that are likely to yield a solution, and take a look at how his career transformed from a Hollywood writer to a website entrepreneur.

Gratch06Commented:
This compiles just fine for me....
0
jkrCommented:
>>This compiles just fine for me....

Not really surprising - the above code does not use the operators.
0
str8dnAuthor Commented:
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
str8dnAuthor Commented:
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
SteHCommented:
No problem for me to use <fstream> on VC++ 6.0 SP5.
0
str8dnAuthor Commented:
<fstream> (when not using the .h) screams by causing 'cout' to no longer be recognized.
0
SteHCommented:
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
SteHCommented:
Since you do not have a line
using namespace std;
you need to use
std::cout if I remember correctly.
0
str8dnAuthor Commented:
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
jkrCommented:
SoIs the above the *exact* code, i.e. the classes are not derived or anything else?
0
SteHCommented:
Try to replace <fstring.h> with <fstring>
0
str8dnAuthor Commented:
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
SteHCommented:
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
SteHCommented:
<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
jkrCommented:
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
jkrCommented:
It seems that the mixed usage of header files was causing the problem.
0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
str8dnAuthor Commented:
Thanks, I guess <cstring> was the problem?  
Are there drawbacks to using namespace std?
0
jkrCommented:
>>Are there drawbacks to using namespace std?

No. At least, not that I ever encountered any.
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Editors IDEs

From novice to tech pro — start learning today.