Go Premium for a chance to win a PS4. Enter to Win

x
?
Solved

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

Posted on 2003-11-17
21
Medium Priority
?
677 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
  • 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
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.

 
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

Free Tool: Port Scanner

Check which ports are open to the outside world. Helps make sure that your firewall rules are working as intended.

One of a set of tools we are providing to everyone 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

  Included as part of the C++ Standard Template Library (STL) is a collection of generic containers. Each of these containers serves a different purpose and has different pros and cons. It is often difficult to decide which container to use and …
Container Orchestration platforms empower organizations to scale their apps at an exceptional rate. This is the reason numerous innovation-driven companies are moving apps to an appropriated datacenter wide platform that empowers them to scale at a …
The viewer will learn how to use NetBeans IDE 8.0 for Windows to connect to a MySQL database. Open Services Panel: Create a new connection using New Connection Wizard: Create a test database called eetutorial: Create a new test tabel called ee…
The goal of the video will be to teach the user the concept of local variables and scope. An example of a locally defined variable will be given as well as an explanation of what scope is in C++. The local variable and concept of scope will be relat…
Suggested Courses

773 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