Dominick Piganell
Dominick Piganell

Reputation: 714

Overloading << operator error

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

Answers (1)

Blood
Blood

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

Related Questions