Solved

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

Posted on 2003-11-17
21
674 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 125 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
[Live Webinar] The Cloud Skills Gap

As Cloud technologies come of age, business leaders grapple with the impact it has on their team's skills and the gap associated with the use of a cloud platform.

Join experts from 451 Research and Concerto Cloud Services on July 27th where we will examine fact and fiction.

 
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 125 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

Free Tool: Path Explorer

An intuitive utility to help find the CSS path to UI elements on a webpage. These paths are used frequently in a variety of front-end development and QA automation tasks.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

Question has a verified solution.

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

When writing generic code, using template meta-programming techniques, it is sometimes useful to know if a type is convertible to another type. A good example of when this might be is if you are writing diagnostic instrumentation for code to generat…
C++ Properties One feature missing from standard C++ that you will find in many other Object Oriented Programming languages is something called a Property (http://www.experts-exchange.com/Programming/Languages/CPP/A_3912-Object-Properties-in-C.ht…
The viewer will learn how to use and create keystrokes in Netbeans IDE 8.0 for Windows.
The viewer will learn how to use the return statement in functions in C++. The video will also teach the user how to pass data to a function and have the function return data back for further processing.

632 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