Reputation: 714
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() << "°";
}
Upvotes: 2
Views: 1292
Reputation: 4186
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)
Upvotes: 1