2

I'm getting an error on this operator overload. Here is the error that I'm getting:

Angle.cpp:466: error: ambiguous overload for 'operator<<' in '(+out)->std::basic_ostream<_Elem, _Traits>::operator<< [with _Elem = char, _Traits = std::char_traits](((const Angle*)this)->Angle:: getDegrees()) << "\37777777660"'

Here is my class to overload the << operator

#ifndef OUTPUTOPS_H
#define OUTPUTOPS_H 1

#include <ostream>
#include "BoolOut.h"

// Prints the output of an object using cout. The object
// must define the function output()
template< class T >
std::ostream& operator<<(std::ostream& out, const T& x)
{
    x.output(out);

    return out;
}

#endif // OUTPUTOPS_H

The problem happens here:

void Angle::output(std::ostream& out) const
{
    out << getDegrees() << "°";
}

Which oddly enough happens not from getDegrees() but from the string. I tried changing the string to something like, "hello" just to make sure that it wasn't the symbol but I received the same error.

Here is the rest of the code excluding unrelated code:

// Angle.h

#include "OutputOps.h"
// End user added include file section

#include <vxWorks.h>
#include <ostream>

class Angle {

public:
    // Default constructor/destructor
    ~Angle();

    // User-defined methods
    //
    // Default Constructor sets Angle to 0.
    Angle();
    //
    ...
    // Returns the value of this Angle in degrees.
    double getDegrees() const;
    ...
    // Prints the angle to the output stream as "x°" in degrees
    void output(std::ostream& out) const;

};

#endif // ANGLE_H


//  File Angle.cpp

#include "MathUtility.h"
#include <math.h>
// End user added include file section

#ifndef Angle_H
#include "Angle.h"
#endif


Angle::~Angle()
{
    // Start destructor user section
    // End destructor user section
}

//
// Default Constructor sets Angle to 0.
Angle::Angle() :
radians( 0 )
{
}

...
//
// Returns the value of this Angle in degrees.
double Angle::getDegrees() const
{
    return radians * DEGREES_PER_RADIAN;
}

//
// Returns the value of this Angle in semicircles.
...

//
// Prints the angle to the output stream as "x°" in degrees
void Angle::output(std::ostream& out) const
{
    out << getDegrees() << "°";
}
4
  • 1
    Isn't there an included ostream& operator<<(ostream &, char *) or ostream & operator<<(ostream &, string &) ? In which case, the compiler can't choose between that included one and your template <class T> ostream& operator<<(ostream, T&), they both apply. Commented Jul 19, 2012 at 19:05
  • 3
    You define operator<< for all types. Obviously it conflicts with operator<< which is already defined for some types such as std::string. Commented Jul 19, 2012 at 19:05
  • possible duplicate of ambiguous overload for ‘operator<<’ in ‘std::cout << Commented Jul 19, 2012 at 19:14
  • @n.m. I wanted to be able to ask the question again, but now have a better understanding. When I first asked it, I didn't understand the problem, and wouldn't be able to understand the answers I was getting. Commented Jul 19, 2012 at 19:19

1 Answer 1

1

It's because you use template in your overloaded operator<<, but this overload is not in class, so you can't set typename T. In other words, you have to overload operator<< for every type of variable which you would like to use or overload this operator in class which also is a template. For example:

std::ostream& operator<<(std::ostream& out, const Angle& x)
{
    x.output(out);

    return out;
}

This error means that compiler can't predict what kind of variables will be used there.


You overload this operator for all possible data, so when you pass getDegrees() function, which returns double then i don't think that x.output(out); will work ;) (hint x will be double)

Sign up to request clarification or add additional context in comments.

2 Comments

Template was being used because this overload will be used for multiple different variables being passed to it. This code is also legacy code that is being updated slightly, so I know this has worked in the past, but now it won't.
You overload this operator for all possible data, so when you pass getDegrees() function, which returns double then i don't think that x.output(out); will work ;) (hint x will be double)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.